0x01 前言
今天pwnable.kr不知道什么原因網(wǎng)站掛掉了,pwnable.tw對(duì)于我又太難,每題做的我很難過(guò),聽(tīng)從小伙伴的建議,決定從ctf的pwn入手。
0x02 工具
file pwn0 //查看文件格式,i386,x86_64等
objdump -S pwn0 | less //查看匯編代碼,查看相關(guān)的函數(shù)信息。
轉(zhuǎn)到IDA F5看看偽代碼
edb,類似windows上的OD,不過(guò)小細(xì)節(jié)上還是不行,操作不方便。
gdb+peda
b main 下斷點(diǎn)
p system 查看函數(shù)位置
ni = od F8;si = od F7 一個(gè)next,一個(gè)step
x 查看任意位置內(nèi)存。x \10xw %sp 查看棧的值。
layout asm|reg 分屏查看匯編代碼|寄存器狀態(tài)windows subsystem of linux //目前可以用來(lái)objdump,編些小代碼,腳本。
pwntools
0x03 Linux匯編
Linux和Unix使用的是AT&T風(fēng)格的匯編,一開(kāi)始不太適應(yīng)。而windows使用了Intel風(fēng)格的匯編。從外形上看區(qū)別如下
- 操作賦值方向。
AT&T:mov 1,eax
Intel:mov %eax,$1
2.前綴。
AT&T:mov 1,eax
Intel:mov %eax,$1
3.后綴。
AT&T:movb %al,%bl //指令后可跟b(byte),w(word=2b),l(long=4b)表示字節(jié)數(shù)。此外還有其他更 復(fù)雜的擴(kuò)展。
此外,對(duì)于ELF文件,windows下IDA反編譯的匯編代碼是Intel風(fēng)格的,Linux下objdump是AT&T風(fēng)格的。
函數(shù)傳參的方式,在i386都是壓棧傳參數(shù)的;到了x64,推薦使用寄存器傳參。
0x04 shellcode
一些簡(jiǎn)單的題直接跳轉(zhuǎn)到目標(biāo)函數(shù),就可以讀取flag文件了。這類題覆蓋返回地址即可。
其他題,需要執(zhí)行指令拿shell,即編寫shellcode。
當(dāng)獲取任意地址讀寫能力時(shí),即可寫入shellcode,再執(zhí)行此處的代碼即可。
shellcode可以讀取flag,更一般的可以用pwntools中的shellcraft。
以上內(nèi)容參考http://www.cnblogs.com/helica/p/6798915.html