푸르미르

pwnable.kr 6.random 본문

SECURITY/pwnable

pwnable.kr 6.random

((•_•)) 2021. 4. 6. 01:09

 

접속 후 ls

 

 

 

cat random.c

 

 

 

unsigned 변수 random에 rand()함수의 반환값(난수)을 넣었다.

key를 입력받고, key^random(XOR) == 0xdeadbeef와 같으면 flag(답)을 얻을 수 있다. 

 

이렇게 보면 간단해보이는데 착각일 수 있으니 설레발 떨지 말아야지ㅎ

 

여기서 rand()만을 통해 난수를 한번 생성할 경우, 값이 고정이 되는 성질을 갖고 있다. => 컴파일을

몇번을 하더라도 난수가 같은 값이 생성된다는 뜻

 

gdb를 통해 컴파일하여 어셈블리어를 통해 rand()의 반환값이 무엇인지 알면 풀릴 것 같다.

gdb random

disas main ->main 함수 분석

 

 

체크한 부분 보면 rand 함수 호출 후 리턴값을 eax에 저장 후 0x400760이라는 주소에 저장했다.

이때 eax는 extended accumulator register로 산술, 논리 연산을 수행하고, 함수의 리턴값을 저장하는 레지스터이다.

 

0x0000000000400609주소에 중단점을 걸고,

다시 실행

 

$eax를 보면

0x6b8b4567이 저장되어있다.

 

그러면 scanf로 입력받은 key값과 0x6b8b4567이 xor연산하여 0xdeadbeef와

동일하면 된다!!

 

 

0x6b8b4567 XOR 0xdeadbeef 해주면 입력값 KEY값이 나온다. (XOR연산을 또 해주면 됨)

 

그런데 이때 DEC 값 즉 10진수값이 마이너스가 나온다. 하지만 여기서 주의할게 KEY는 UNSIGNED 변수이기 때문에 음수가 되어서는 안된다. 그래서 3039230856

 

 

flag값은 Mommy, I thought libc random is unpredictable...

 

'SECURITY > pwnable' 카테고리의 다른 글

pwnable.kr 8. leg  (0) 2021.04.28
pwnable.kr 7. input  (0) 2021.04.06
pwnable.kr 5.passcode (문제 파악)  (0) 2021.03.31
pwnable.kr 4.flag  (0) 2021.03.31
pwnable.kr 3.bof  (2) 2021.03.24