#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가 나오면 문제가 풀린다.
구글링을 하면서 찾아보니 rand함수에는 취약점이 존재한다.
seed값을 알면 rand함수의 리턴값을 예측 할 수 있다는 것이다.
[C/C++] 랜덤 값 생성을 위한 rand() 함수 설명 및 한계
<본 글은 win32 api를 바탕으로 작성되었습니다.> 개발을 하다 보면 랜덤 값을 생성해야 하는 경우가 있다. 이때 자주 사용되는 함수가 rand() 함수이다. * rand() 함수 설명 C에서 rand() 함수는 랜덤 값
onlywis.tistory.com
seed값을 알기 위하여 gdb를 사용하자.
gdb-peda를 이용하기 위해서는 gdb창에서
source /usr/share/peda/peda.py
를 입력해주면 된다.
rbp, rsp가 나오는 것을 봐서 64비트이다. (문제 푸는데 전혀 쓸모없는 얘기)
rand함수가 호출되는 다음부분 main+18부분에
break point를 걸어준다.
RAX값에 0x6b8b4567이 들어가있는 것을 볼 수있다.
(RAX : 산술 연산 및 함수 반환값에 사용)
main +13 에서는 RAX가 0x00값이고 rand함수 이후에 rax값이 0x6b8b4567인것을 보아
아마 0x6b8b4567가 seed값일것같다.
seed값을 알았으니 문제를 풀어보자
'Write-Up > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] mistake 풀이 (0) | 2021.09.23 |
---|---|
[pwnable.kr] input 풀이 (0) | 2021.07.28 |
[pwnable.kr] passcode 풀이 (0) | 2021.07.22 |
[pwnable.kr] blukat 풀이 (0) | 2021.03.26 |
[pwnable.kr] memcpy 풀이 (0) | 2021.03.25 |