tmxklab
[HackCTF/Pwnable] Random Key 본문
1. 문제확인
nc ctf.j0n9hyun.xyz 3014
1) 접속
key값을 입력하라는 출력창이 뜨고 입력을 받을 수 있는 프로그램
2) IDA(Pseudocode)확인 - main()
- time함수에 널 값을 넣어 1970년 1월 1일 0시(UTC 타임존)이후부터 인자 값까지 현재까지 흐른 초 수를 계산하여 v3에 저장하여 반환
- srand함수에 v3인자를 넣어 v3인자를 기반으로 난수를 초기화
- rand함수를 통해 실제 난수 값을 v5변수에 저장
- 사용자의 입력 값을 저장하는 v4와 난수 값이 저장된 v5와 비교하여 참이면 flag값을 보여주며 종료
3) $checksec를 통해 elf파일에 걸린 메모리 보호기법 확인
2. 접근방법
1) 사용자의 입력 값의 저장하는 변수와 난수를 저장하는 변수 확인
- [rbp-0x10] : 사용자의 입력 값의 저장하는 변수가 위치한 곳
- [rbp-0xc] : 난수를 저장하는 변수가 위치한 곳
- 따라서, 사용자가 입력하 값의 저장하는 변수보다 난수를 저장하는 변수가 스택 윗 부분(낮은 주소 방향)에 있으므로 bof를 통해 덮어쓸 수 있음
추측) rand함수는 srand를 통해 기준 값을 정하여 난수를 만드는 것이므로 서버의 seed와 자신이 만든 seed를 같게 한다면 동일한 난수 값을 찾을 것이다.
추측이 맞는지 확인하기 위해 간단한 코드를 작성하여 실행해보자
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int my, server;
srand(time(NULL));
my = random();
srand(time(NULL));
server = random();
printf("my num : %d server: %d ", my, server);
return 0;
}
- 실행 결과
똑같은 난수 값이 생성되는 것을 확인할 수 있다.
2) 결론
- 서버 시작 시간과 맞춰서 로컬에서 작성한 난수 값을 출력하는 프로그램을 실행시키면 동일한 seed를 기반으로 난수 값이 나오므로 이를 통해 문제를 해결한다.
3. 풀이
1) 서버 프로그램과 동일하게 랜덤 값을 출력하는 프로그램 작성
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(NULL));
printf("%d", rand());
return 0;
}
2) 공격 실행
세미콜론(;)을 붙여 프로그램 실행과 동시에 서버를 시작함
'War Game > HackCTF' 카테고리의 다른 글
[HackCTF/Pwnable] Beginner_Heap (0) | 2020.03.07 |
---|---|
[HackCTF/Pwnable] RTL_Core (0) | 2020.02.23 |
[HackCTF/Pwnable] 1996 (0) | 2020.02.23 |
[HackCTF/Pwnable] Poet (0) | 2020.02.22 |
[HackCTF/Pwnable] g++ pwn (0) | 2020.02.22 |