728x90
이번 포스트에서는 Pwnable의 random 문제에 대해 다루겠다.
문제 코드는 다음과 같다.
#include <stdio.h>
int main(){
unsigned int random;
random = rand(); // random value!
unsigned int key=0;
scanf("%d", &key);
if( (key ^ random) == 0xdeadbeef ){
printf("Good!\n");
system("/bin/cat flag");
return 0;
}
printf("Wrong, maybe you should try 2^32 cases.\n");
return 0;
}
## 문제 해석 :
해당 문제의 코드를 살펴보니 key값과 random값의 XOR 연산 값이 0xdeadbeef가 되어야 해결할 수 있는 것으로 보인다.
또한 random값이 일정하게 생성된다는 사실도 알 수 있다. random값을 매번 다르게 생성하려면 srand(time(NULL))을 써야 하기 때문이다.
## 문제 풀이 :
먼저 random 값을 알아낸 다음에 XOR 연산을 통해 Key값을 알아내면 된다.
먼저 main함수를 디스어셈블 해보면 빨간 박스가 random 함수가 생성된 시점임을 알 수 있다. 그럼 빨간 박스의 다음 줄인+18에다가 break를 걸고 random 값을 알아내보겠다.
빨간 네모 박스 rax의 값인 0x6b8b4567이 random 값임을 확인할 수 있다. 이를 0xdeadbeef와 XOR하면 다음과 같다.
## 최종 결과 :
### 공격문 : 3039230856
### 실행 결과 :
Flag = Mommy, I thought libc random is unpredictable...
'Wargame > Pwnable' 카테고리의 다른 글
Pwnable (8. leg) (0) | 2022.07.06 |
---|---|
Pwnable (7. input) (0) | 2022.07.05 |
Pwnable (5. passcode) (0) | 2022.07.03 |
Pwnable (4. flag) (0) | 2022.07.02 |
Pwnable (3. bof) (0) | 2022.06.22 |