0x01 ๋ฌธ์ ์ค๋ช
scp -P 2222 col@pwnable.kr:[๋์ ํ์ผ] [๋ฐ์ ์์น]
๋ช
๋ น์ ํตํด ๋ก์ปฌ๋ก col
๊ณผ col.c
ํ์ผ์ ๋ฐ์์๋ค.
๋ํ, ๋ก์ปฌ์์ pwntools ๋ฅผ ์ฌ์ฉํด ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
from pwn import *
argv = [b"AAAA"]
s = ssh("col", "pwnable.kr", port=2222, password="guest")
p = s.process(["/home/col/col"] + argv)
0x02 ํ์ด ๊ณผ์
#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
int* ip = (int*)p;
int i;
int res=0;
for(i=0; i<5; i++){
res += ip[i];
}
return res;
}
int main(int argc, char* argv[]){
if(argc<2){
printf("usage : %s [passcode]\n", argv[0]);
return 0;
}
if(strlen(argv[1]) != 20){
printf("passcode length should be 20 bytes\n");
return 0;
}
if(hashcode == check_password( argv[1] )){
setregid(getegid(), getegid());
system("/bin/cat flag");
return 0;
}
else
printf("wrong passcode.\n");
return 0;
}
argv[1] ๋ถํฐ 4byte์ฉ ์ด 20byte์ ๊ฐ์ ๋ํด, 0x21DD09EC
์ ๋น๊ตํ๋ ๊ฐ๋จํ ์ฝ๋๋ค.
์ธ๊ธํ๋ฏ์ด ๋ํด์ 0x21DD09EC
๊ฐ ๋๋ 5๊ฐ์ ์ ์๋ฅผ ์
๋ ฅํด ์ฃผ๋ฉด ๋๋ค.
์ด๋ ์์ผ๋ก ์ธ์๋ฅผ ๊ตฌํด ๋ณด๋ด์ฃผ๋ฉด ์ ํด๊ฒฐ๋ ๊ฒ์ด๋ค.
from pwn import *
key = 0x21DD09EC
a = key // 5
b = key - a*4
argv = []
pay = p32(a) * 4
pay += p32(b)
argv.append(pay)
s = ssh("col", "pwnable.kr", port=2222, password="guest")
p = s.process(["/home/col/col"] + argv)
# p = process(["./col"] + argv)
p.interactive()
0x03 ๊ฒฐ๊ณผ ํ์ธ
- FLAG
-
๋๋ณด๊ธฐTwo_hash_collision_Nicely
0x04 ํ๊ณ ๋ฐ ์ฐธ๊ณ ๋ด์ฉ
c์ธ์ด ์ฝ๋๋ฅผ ์ ์ดํดํ๊ณ , argv๋ฅผ ํตํด ์ธ์๋ฅผ ์ ๋ฌํ ์ ์๋ค๋ฉด ์ฝ๊ฒ ํ ์ ์๋ ๋ด์ฉ์ด์๋ค. ํนํ ๊ฐ์ ํ๋ณํ ๋ถ๋ถ๊ณผ int(4byte)๋ ์ ๊ธฐ์ตํด์ผ๊ฒ ๋ค.
'wargame ๐ดโโ ๏ธ write-up > pwnable.kr' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
bof (0) | 2025.05.03 |
---|---|
1. fd (0) | 2022.02.15 |