攻防世界 Pwn pwn-100
1.题目下载地址
2.checksec

64位程序,目前还什么都看不出看来,直接拉近IDA看看
3.IDA分析


-
整个程序由3个嵌套的程序组成
-
我们可以看到sub_40063D是主要的程序,接受单个字符并存储到传入的参数a1所指向的空间之内
-
同时分析sub_40068E发现sub_40063D中a1就是sub_40068E中的v1
-
并且v1的栈空间大小就只有0x40,而sub_40063D接受的输入量有0x200个字节,这样就存在栈溢出漏洞了。
-

-
通过分析函数列表,里面有puts这个库函数,联系pwntools中的DynELF,我们可以将libc的地址泄露出来,再来构造ROP
-
64位程序构造ROP与32位程序不一样
x86中,函数调用是直接将参数压栈,需要用的时候直接将参数放在栈上,调用的函数就能直接取得参数并运算。如图:

调用read函数的时候,参数直接放入栈中,但是x64的程序不一样,x64的gcc优化了x86的传参方式,x64程序设立了几个寄存器李存放参数,调用函数的时候先向寄存器之中放参数,当参数的数量大于寄存器的时候,才会向栈中放参数。

这是本题中的sub_40068E函数,可以看到其参数是放在rdi和esi两个寄存器之中的,这就是两种结构的不一样,如果要在x64的程序之中构造rop,我们就必须向寄存器存放参数。

可看出只要rbx和rbp不相同就会跳转回去循环,这是我们不允许的,我们需要控制程序流ret到我们需要的地方去,故预先设置rbx=0,rbp=1即可让程序继续执行我们构造的ROP链。故可以构造payload1=‘a’*0x48+p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main) 泄露puts的地址,从而确定libc和libcbase

经过查找发现不存在/bin/sh,需要自己写入,gdb中vmmap发现0x601000为基址的地址可写,到ida查找,选择0x601040进行写入

4.exp
from pwn import *
# context.log_level = 'debug'
io = remote(

本文详细分析了一个64位程序的栈溢出漏洞,通过IDA逆向工程揭示了程序结构,并利用DynELF库泄露libc地址。通过精心构造的payload,实现了控制程序流程,最终获取了系统的控制权。过程中涉及了x64下的函数调用机制、ROP链构造及/bin/sh的注入技巧。
最低0.47元/天 解锁文章
494

被折叠的 条评论
为什么被折叠?



