2023. 2. 23. 21:50ㆍPwnable/Pwnable.kr
#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;
}
오오 드디어 쉬운 문제인가 !! 싶었다.
코드가 너무나도 단순했기에 너무 설레는 마음으로 문제풀기를 시작했다.
scanf 를 통해 key 값을 할당 받는다.
random 값은 rand(); 함수로 랜덤값을 넣는다.
그렇게 Key 값과 random 을 연산하여 참이 되면 플래그를 출력하는 문제다.
드림핵에서 canary 강의를 보며 따라했던 방식처럼 임의적으로 바뀌는 랜덤값을 찾은 후 넣으면 되지 않을까 생각을 했다.
일단 rand() 함수에서 어떤 형식으로 값들이 이루어지는 찾아봤다.
이걸 보고 선린에서 rand 함수를 통해 풀었던 문제가 떠올랐다.
위에 글에서도 나와있지만
rand 함수는 한번 지정된 랜덤값이 지속적으로 출력 된다.
즉 프로그램을 한번 시작한 이상 몇번을 실행하든 같은 랜덤값이 배정된다.
이를 방지하려면 srand 함수를 사용하면 된다.
아무튼 해당 문제의 핵심은 랜덤값은 정해져 있다는 것이다.!
gdb를 통해 랜덤값을 뜯어보고 이 값을 가지고 key 와 연산한 결과를 출력하면 될 것이다 !
pwndbg를 통해 까보자 !
rand 함수 호출후 바로 시행되는 부분이다. 이 부분을 통해 rbp-0x4에 eax 값을 넣는 걸 확인할 수 있다.
즉 random 변수는 rbp-0x4에 저장 된다.
해당부분에 bp를 걸어 까봤다.
이는 지정된 랜덤 값이 될 것이다.
이후 main 함수에 다른 부분을 보면
scanf 함수 호출 후 저장되는 rbp-0x8은 key 값을 나타낼 것이다.
위를 보면 eax에 저장된 rbp-0x8 값고 rbp-0x4 가 xor 연산을 한다.
xor 연산은 각 비트가 같은 값인지 확인하는 역할을 한다.
코드에는
이 부분일 것이다.
^가 무슨 연산인지 모르겠다만 나에게는 킹갓짱 Python3가 있다.
이를 통해 연산 결과를 출력할 수 있을 것이다.
라는 값을 얻을 수 있다.
해당 값을 넣으면 플래그를 얻을 수 있지 않을까??
야호 ! 성공이다ㅏㅏㅏ
이번 문제는 굉장히 쉬웠다 !
'Pwnable > Pwnable.kr' 카테고리의 다른 글
pwnable.kr -5- passcode (0) | 2023.02.23 |
---|---|
Pwnable.kr - 4 - flag (0) | 2023.01.26 |
Pwnable.kr - 3 - bof (0) | 2023.01.25 |
Pwnable.kr -2- col (0) | 2023.01.25 |
pwnable.kr - 1 - fd (0) | 2023.01.25 |