문제 설명
리눅스 터미널을 통해 접속해 보니까 이렇다.
내가 어떤 패스워드를 입력해야 하는 것 같은데, 아직까진 힌트가 아무 것도 없으니 문제 파일부터 살펴본다.
prod라는 이름의 파일이 있는데, 파일 형식을 도무지 모르겠다.
노트패드나 리눅스 텍스트편집기에서 열어도 다 깨진 텍스트로 나옴.
그래서 IDA에 집어넣었다!
어셈블리어 상태로는 너무 방대하다.
바로 디컴파일 해줬음.
int __fastcall main(int argc, const char **argv, const char **envp)
{
int fd; // [rsp+Ch] [rbp-44h]
_QWORD *v5; // [rsp+10h] [rbp-40h] BYREF
__int64 v6; // [rsp+18h] [rbp-38h] BYREF
char s2[40]; // [rsp+20h] [rbp-30h] BYREF
unsigned __int64 v8; // [rsp+48h] [rbp-8h]
v8 = __readfsqword(0x28u);
proc_init(argc, argv, envp);
fd = open("/dev/urandom", 0);
read(fd, password, 8uLL);
close(fd);
puts("can u guess me?");
sleep(0);
read_input(s2, 32LL);
if ( !strncmp(password, s2, 8uLL) )
{
system("cat flag");
}
else
{
puts("wrong... :p");
puts("can you try another path? maybe impossible");
printf("> ");
read_input(&v5, 8LL);
printf("> ");
read_input(&v6, 8LL);
*v5 = v6;
puts("wish your happy sleep");
}
return 0;
}
터미널에서 실행하면 "can u guess me?" 라는 문자열이 출력되고,
그 이후에 사용자가 입력한 값이 password와 일치할 시 cat flag를 해서 플래그를 보여준다는 걸
if ( !strncmp(password, s2, 8uLL) )
{
system("cat flag");
}
이 대목을 통해 알 수 있다.
strncmp를 클릭해 내용을 보면
int strncmp(const char *s1, const char *s2, size_t n)
{
return strncmp(s1, s2, n);
}
이러함.
그리고 "/dev/urandom"을 통해 랜덤한 수를 골라내는 걸로 보아 password에 변수로 난수가 들어간다는 듯...
도무지 모르겠어서 strncmp() 함수의 허점에 대해 서치해 봤다.
드림핵 문제 코멘트에서 다들 strncmp()의 허점을 이용해야 풀이할 수 있다길래...
strncmp() 함수는, \x00이 올 때까지만 비교한다. null이 오면 비교를 끝낸다.
난수인 password가 \x00으로 시작하는 경우, input으로 null을 넣으면 그냥 바로 같은 문자열로 인식하는?... 그런 거라고 함. 그래서 확률적으로 256번 null을 쏘는 코드를 만들면 그 중에 한 번은 플래그를 얻을 수 있다...
from pwn import *
while True:
r = remote("host3.dreamhack.games", 12955)
r.recvuntil(b'can u guess me?\n')
r.send(b'\0')
res = r.recv(100)
r.close()
if b'DH' in res:
print(res)
break
내가 실행한 코드...
근데 너무 오래 걸렸다~~
어쨌든 플래그 획득 성공.
모로 가도 서울만 가면 그만이지...
'SWUFORCE > 워게임 풀이' 카테고리의 다른 글
[wargame.kr] tmitter (web) (0) | 2024.09.24 |
---|---|
[wargame.kr] strcmp (web) (0) | 2024.09.24 |
[Dreamhack] rev-basic-0 (reversing) (0) | 2024.08.27 |
[Dreamhack] file-special-bit (misc) (0) | 2024.08.20 |
[Dreamhack] addition-quiz (misc) (0) | 2024.08.20 |