
마지막 200점짜리 문제
[사전조사]

실행해봤더니 정품 키 인증같은걸 구현해놓은것 같다.

쉘코드 삽입 기법은 불가능하다.
[코드 분석하기]

var_10과 var_c의 값을 일치시키면 되는것같다. 이들 변수에 대해서 더 자세히 알아보자

처음에 0을 인자로 해서 time 함수가 호출되고, 그 결과가 srand()함수의 인자로 들어가며 , 그 다음으로 실행되는 rand함수의 결과가 eax->varC로 이동되고 있다.
조금 익숙한 흐름이라고 생각했다.
합쳐보면, srand(time(0)); var_C=rand()인데, 이는 현재시간을 기반으로 시드를 생성하고, 이 시드를 기반으로 랜덤 정수를 생성하는 랜덤함수의 기본 사용 형태였다.
var_C에는 랜덤함수의 결과가 들어간다는것을 알았다.

scanf를 보면 "%d"와 함께 인자로 var_10의 주소를 받고 있다. (var_10 address0->rax->rsi)
var_10에는 사용자의 입력값이 들어간다는 것을 알 수 있다.
[해결 전략]
정수 하나만 입력받는지라 오버플로우를 해서 RTL 기법을 써서 다른 함수를 실행시킬수도 없었고, (어차피 라이브러리 파일 없어서 불가능)
오히려 쉽게 생각해서 그냥 랜덤으로 나오는 수를 때려맞춰볼까? 라는 생각을 해봤다.
time(0)은 1971년 1월 1일부터 현재까지 지난 시간을 초단위로 반환한다.
그리고 시드가 같으면 rand()를 몇번 호출했냐에 따라 나오는 숫자들이 항상 똑같다.
이렇게되면.. 미래에 나올 rand()함수의 결과를 예측하는게 가능하지 않을까?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
srand(time(0)+10);
printf("%d",rand());
}
10초 뒤 랜덤 함수의 결과를 출력하는 코드이다. 이 코드를 통해 추출해낸 난수를 10초 뒤에 문제에 있는 프로그램을 실행해서 넣으면 될것같다. 로컬에서 한번 테스트를 해봤다.

몇번의 시도 끝에 성공했다.
일단 되는것 같고, 복잡한 작업은 필요 없기에 굳이 공격 코드를 작성하지 않고, 수작업으로 할 예정이다.
컴퓨터의 시간은 문제 서버 시간이랑은 다르므로.. 네이비즘을 통해 서버시간을 확인할 것이다.

내 컴퓨터에서 랜덤 함수를 시작한 시각(내 컴퓨터 기준) + 10초 = 문제 서버의 프로그램을 실행시킨 시각(서버 기준 시각)이 되어야 한다.
이를 이용해서 타이밍을 맞춰 프로그램을 실행시키고, 값을 넣어준다.
[실행해보기]
본인의 경우에는 컴퓨터시각과 서버 시각이 거의 맞았기 때문에 네이비즘을 이용해서 rand 프로그램 실행 후 10초 뒤에 nc로 접속해서 rand 프로그램으로 얻어낸 결과값을 넣어줬다.

운이 좋아서 한번에 성공하긴 했다.

[마무리]
시스템해킹 보다는 함수에 대한 이해와 많이 가까웠던 문제였던것 같았다. 이번 문제를 통해서 랜덤 함수를 더 자유자재로 다룰 수 있을것 같았다. 참고로 저 프로그램을 윈도우에서 실행하면 시드와 호출 횟수가 같아도 값이 다르게 나온다.
'정보보안' 카테고리의 다른 글
| [문제해결] Reversing.Kr Music Player 해결과정 (0) | 2022.02.03 |
|---|---|
| [문제해결] Reversing.kr Easy Keygen 해결과정 (0) | 2022.02.01 |
| [문제해결] HackCTF Poet 해결과정 (0) | 2022.01.22 |
| [문제해결] HackCTF RTL_World 해결과정 (0) | 2022.01.22 |
| [문제해결] HackCTF yes or no 해결과정 (0) | 2022.01.21 |