pwnable.kr 6.random
접속 후 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...