본문 바로가기

Write-Up/pwnable.kr

[pwnable.kr] 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가 나오면 문제가 풀린다.

구글링을 하면서 찾아보니 rand함수에는 취약점이 존재한다.

seed값을 알면 rand함수의 리턴값을 예측 할 수 있다는 것이다.

onlywis.tistory.com/4

 

[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

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