여행 다녀온 후 오랜만에 푼 문제이다.

문제는 ascii_easy !

문제 이름대로 쉬운? (다른문제에 비해)




(ascii_easy)



문제내용은 이렇다.



(문제 내용)



일단 접속하여 소스코드부터 확인하였다.




(소스코드)



소스코드를 보니 아스키문자인지 체크하는 함수가 들어있다.
인자로 아스키문자가 아니면 쫓겨난다.

그리고 취약한 함수를 대놓고 vuln 이름으로 만들어놓았다. 
이 부분을 버퍼 오버플로우하는 거구만! (다행히 스택카나리가 적용되어있지 않았다.)

그리고 주목되는? 부분이 있었다.



(중요부분)



???
libc-2.15.so 파일을 가져다가 통째로 메모리에 쿵 올린다.

mmap 함수를 gdb로 동작확인해보겠다.



(mmap 함수 인자)



인자를 보니 파일 내용이 덤프될 주소 0x5555e000 이 보인다.

함수를 실행하여 덤프된 주소를 보자!



(덤프된 내용)



처음에는 데이터가 매핑이 이상하게 되었나 싶었다. (여기서 조금 헤맸다.)
(위의 캡쳐 화면은 내가 so 파일을 헥스로 수정하여 그대로 저장시킨 값이다. 그래서 위처럼 나온것)

아래 내용은 hex모드로 so 파일을 연 것이다.



(so 파일)



여기서 30303030... 이 뭘까 싶었는데 내가 헥스로 수정하고 다시 제대로 저장해야하는데 그대로 저장을 시켜서 위 화면대로 저장이 된것이다... 그렇기 때문에 아래와 같이

00000000: ~~~~ 헥스모드에 나와있는 텍스트가 그대로 메모리에 올라간 것이다...


(헥스모드 상황)



그렇군! 여기서 파일의 데이터가 떡하니 올라가는 것을 확인했으니 그 다음부터는 고민 없이
이 파일에 Nop 코드와 쉘코드를 넣어주어 bof 시킨 후 ret 주소에 해당 쉘코드 주소를 넣어주면 된다.

사실 여기서 Nop 코드 없이 정확히 쉘코드 주소를 맞출 수 있기 때문에 필요없긴 하지만
그냥 넣었다.

테스트!
놉코드 100개와 A 10개를 넣어보았다.




(테스트!)



그 후 메모리 상황!



(메모리 모습)



그렇다면 내가 만들수 있는 아스키문자중 가장 작은 값이
55562121 -> UV!! 

이다. 그렇기에 해당 주소까지 놉이 몇개 필요한지 계산해본다.




(Nop 개수)



16진수로 4121 
10진수로 16673개가 필요하다.

놉코드를 4개 더 추가시켜서 ( 놉코드 안에 안착시키기 위해)

그 뒤에 쉘코드를 이어붙여준다.



(so 파일 구성)



이렇게 하고 UV!! (55562121) 주소로 가보면



(쉘코드)



놉코드와 쉘코드를 만날 수 있다.

이제 원본 파일에 링크를 걸어서 실행할 것이다.(원본파일에 setuid가 걸려있기 때문에!)

취약 함수를 오버플로우 시켜 (더미 32개) ret 주소에 UV!! 를 넣어준다. (엔디안에 맞춰서)



(공격 성공!)



쉘을 획득하였다.

의도된 풀이를 보니 execve 함수를 이용하여 풀게 되어있다. execve 함수 주소를 보니 우리가 구성할 수 있는 아스키코드 주소로 되어있는 걸 확인 할 수 있다.



(의도된 방법)

'WarGame > 500 Project' 카테고리의 다른 글

(59/500) pwnable.kr - dragon  (0) 2017.08.17
(58/500) pwnable.kr - fsb  (0) 2017.08.12
(56/500) pwnable.kr - asm  (0) 2017.07.14
(55/500) pwnable.kr - uaf  (0) 2017.07.12
(54/500) pwnable.kr - cmd1  (0) 2017.07.12


오기로 풀어낸 문제이다.

쉘코드를 만들어주는 파이썬 모듈을 이용하면 편하다고 했지만
나는 내가 만들기 시작한거 내가 직접 만들어서 풀고싶었다.

밤을 새서 찾아보다가 자고 일어나니 리버싱에서 배웠던 기술이 생각이나 문제를 해결할 수 있었다.

asm 문제이다.



(asm)



문제 화면은 이렇다.


(문제 화면)



쉘코드를 만들으라는 것 같다.

문제는 flag 파일 이름이 너무 긴것...



(긴 flag)



sym 링크를 쓰고 싶었지만 chroot로 인해 링크 걸어봤자 소용 없었다.

즉 저 긴 문자열을 쉘코드 안에 넣어야한다는 것...
하도하도 생각하다가 리버싱 공부하면서 배운 기술이 생각났다.

바로 call !!
call 명령어로 아래로 쭉 내려간다 이때 rip를 스택에 저장하고 가는 걸 이용한느 것이다.


(구성한 모습)



뒤에는 문자열들을 입력해준다.

그렇게 되면 엉뚱한 명령어로 인식이 되는데 상관없다. 나는 call을 이용해 이녀석들을 내려갈거기 때문에



(call 사용)



call 을 사용해서 아래로 내려간다.

그런데 올리디버거에서 쓰는거랑 직접 gdb를 이용해 코드를 보니 조금 달라서 직접 asm 를 만들어 테스트해보았다.



(테스트)



테스트 하면서 안 사실!
e8 은 call 명령어 이고
뒤에 0d 만큼 떨어진 곳으로 call 하게 되는 것!

그렇다면 나는 e8 을 이용해 100 떨어진 곳으로 이동시킬 것이다.



(call binary)



그 후 살짝의 미스매치가 있으므로 Nop 코드로 쿠쎤을 깔아준다.



(쿠쎤)



그 후 pop rsi 를 시작하여 open, read, write 함수를 호출하는 코드를 붙이면 끝!




(테스트)




(테스트 성공)



테스트 성공! 기분이 좋다.



(공격도 성공)



공격도 성공하니 기분이 더더 좋다!

'WarGame > 500 Project' 카테고리의 다른 글

(58/500) pwnable.kr - fsb  (0) 2017.08.12
(57/500) pwnable.kr - ascii_easy  (2) 2017.08.09
(55/500) pwnable.kr - uaf  (0) 2017.07.12
(54/500) pwnable.kr - cmd1  (0) 2017.07.12
(53/500) pwnable.kr - blackjack  (0) 2017.07.12


UAF!!
새로 배운 취약점이다.
Use After Free
검색해보니 유명한 취약점이었다.

(몰랐다니...)

검색해서 공부한 후 문제를 풀어보았다. 

uaf 문제이다.


(uaf)



문제 화면은 아래와 같다.


(uaf 문제 화면)



Use After Free 버그를 아냐고 물어본다.

Use After Free 버그란 힙영역에서 일어나는 버그이다.
운영체제의 최적화를 위해 운영체제는 힙에 할당하고 해제한 영역을 flag 비트만 설정해둔 뒤 그 영역의 메모리 데이터를 그대로 남겨둔다.
해제한 힙 영역을 재사용 함으로써 문제가 발생한다.
특히 객체지향 언어인 JAVA, C++ 등 에서 더 강력히 발생한다.

이유는 동적으로 힙영역에 객체를 생성하고 해제하게 되면 그 객체 데이터가 힙 영역 메모리에 그대로 남아있기 때문이다.  객체안에 함수가 있다면 그 영역에 함수 포인터가 존재하는데 만약 객체 해제 후 그 객체의 함수를 재사용하는 코드가 있다면 그 영역의 객체 함수 포인터를 내가 원하는 값으로 덮어 씌워서 프로그램의 실행을 움직 일 수 있다.

소스코드를 보면서 전략을 다시 정리해보자!



(소스코드)



체크할 것은 Use After Free 함수의 취약점 조건은
1. 동적으로 메모리를 할당한다. ( 위 코드는 new라는 함수를 이용해 힙영역에 객체를 만든다. )
2. 메모리를 해제한다. ( free, 여기서는 delete로 메모리 해제한다. )
3. 힙 영역에 다시 메모리를 할당한다. ( 2를 입력하면 new를 이용해 메모리 할당한다. )

조건은 충족됬다.
이 프로그램은 실행하자마자 남자, 여자라는 객체를 생성하므로 메모리 해제 후 우리의 데이터를 힙 영역에 넣는다. 넣으면서 함수 주소를 덮어쓸 것이다. (아직 메모리 확인을 안했으므로 여기까지 계획을 세우고 조금 이따가 구체적으로 생각해보자)



(우리가 불러낼 함수)



남자, 여자 객체는 Human에게서 상속받는다. 즉 남자, 여자 객체 안에는 우리가 불러낼 give_shell 함수를 가지고 있는 것이다.



(덮어쓸 함수)



우리가 덮어쓴 후
객체의 함수를 호출해야하는데 위의 introduce를 불러낼 수 있으므로(1번을 누르면)
introduce 함수 주소에 give_shell 함수 주소를 넣을 것이다.

gdb를 이용해 메모리를 확인해보자.
우선 분기문 case 1: 모양이 보인다.



(case 1)



case 1 이므로
introduce 함수를 불러내는 코드이다.
브레이크를 걸고 실행해보면서 introduce 함수를 어떻게 부르는지 알아보자.


(함수 호출)



rbp-0x38 에서 값을 가져와 rax에 넣는다.
그 후 rax주소에 있는 값을 가져와 8을 더하고 함수를 호출한다.

여기서 rax는 0x401570 이었다.



(0x401570 주소)



0x401570 이 주소에서 8을 더한 위치의 값을 빨간색으로 표시했다.
0x004012d2에 뭐가있나 보면


(0x004012d2)



introduce 함수가 보인다.

그렇다면 -8 위치인 0x0040117a 주소를 확인해보자



(0x0040117a)



우리가 원하던 give_shell 함수 주소이다.

정리를 하면
rbp-0x38 주소는 0x00614c50 이고
여기서 가져온 값이 0x401570이다. 만약 이 값이 0x401570-8이라면 
가져와서 8더한 값이 0x401570일테고 우리의 give_shell 함수가 실행될 수 있다.

즉! 0x00614c50 위치에 0x401570-8가 되면 된다.


(덮어쓸 위치)



내가 A 4개를 입력한 파일을 이용하여 데이터를 2번 쓰니 저 위치를 덮어쓰게 되었다.

이제 공격을 해보자.
 0x401570-8 를 파일에 넣어둔다.



(파일 생성)


그 후 free 해준 뒤 데이터를 2번 써준다. (그래야 우리가 원했던 위치에 값이 올라가므로 -> 이 사실은 내가 gdb를 이용해 실험을 해봐서 나온 결과이다.)


(공격 성공)



해당 쉘을 획득 할 수 있었다.

'WarGame > 500 Project' 카테고리의 다른 글

(57/500) pwnable.kr - ascii_easy  (2) 2017.08.09
(56/500) pwnable.kr - asm  (0) 2017.07.14
(54/500) pwnable.kr - cmd1  (0) 2017.07.12
(53/500) pwnable.kr - blackjack  (0) 2017.07.12
(52/500) pwnable.kr - coin1  (0) 2017.07.12


cmd1 많이 쉬웠던 문제이다!



(cmd1)



문제 화면은 PATH 환경변수를 물어보면서 시작한다.



(문제화면)



접속하면 cmd1이라는 프로그램이 있는데
cmd1의 소스코드 먼저 확인해보자.



(cmd1 소스코드)



소스코드를 보니  PATH를 망가뜨린다. 최상위 디렉토리에 우리가 폴더를 만들수 없으므로
저 경로는 과감히 포기하자!

나의 전략은 내가 쓸수있는 tmp 임시디렉토리로 가서 링크를 생성한다.
flag를 다른 이름으로 링크를 건다. 이유는 필터에서 flag를 필터링하기 때문이다.



(링크 생성)



(링크 확인)



링크 확인후 arg[1] 에 명령을 입력하면된다.
이 때 환경변수가 망가졌으니 절대경로로 입력하면 된다.



(문제 해결)

'WarGame > 500 Project' 카테고리의 다른 글

(56/500) pwnable.kr - asm  (0) 2017.07.14
(55/500) pwnable.kr - uaf  (0) 2017.07.12
(53/500) pwnable.kr - blackjack  (0) 2017.07.12
(52/500) pwnable.kr - coin1  (0) 2017.07.12
(51/500) pwnable.kr - shellshock  (0) 2017.07.11


blackjack 문제이다.


(blackjack)



문제 화면은 이렇다.


(문제 화면)



여기서 C코드를 주었다.
하지만 나는 보지않았다.. 그렇게 먼길을 걷기 시작했다...

문제에 접속을 하면 게임을 할 수 있다.



(게임 룰)



의외로 재밌었다.

부자한테 플래그를 주겠다는 거니 돈을 버는게 목적이구만?

파이썬 코드로 확률을 계산하여 풀기로 했다.
카드 배열을 만든 후 하나씩 pop 하는 방식이다.



(확률 계산 함수)



(게임 함수)



실제로 내가 배팅을 50퍼센트에 걸것이니, 확률도 50 이상이면 h (go)를 외치게 하였다.
그런데 자꾸 지는거다.. 와이어 샤크로 확인해보니..



(같은 숫자?)



같은 카드들이 반복적으로 온다
뭐지? 카드 배열 쓰는게 아니었어???

그렇다면 나도 꼼수로 나간다.
같은 수가 반복적으로 오니까 21에 근접하게 반복하는 것이다.
5가 오면 그 다음 카드도 5일 것이니 3번만 h를 해주면 20이 되고 내가 이길 확률이 커지는 것이다.
그래도 가끔 숫자가 바뀌니까 그거 고려해서 승률을 어림잡아 1/5로 잡고 배팅도 1/5 로 주었다.



(블랙잭 핵 코드)



(블랙잭함수)



자! 실행하니 돈이 쌓여간다.



(난 부자!!)



그런데 마지막에 뜬금포로 파산했다고 중단된다. 돈이 이렇게나 많은데...
(프로그램 오류일 것이다. 더 이상 큰 수를 가질 수 없는거 같다.)
와이어샤크로 확인해보니
100만 달라가 넘는 순간부터 이상한 문구가 딸려온다.



(이상한 문구?)



flag에 입력해본다.




(문제 해결!)



* 문제를 다 풀이한 후 다른 사람들의 알고리즘은 어떻게 되나 싶어서(내가 꼼수를 썻기 때문에)
확인해보니 코드의 결함을 이용한 방법이었다...
앞으로는 문제에서 주어진 것들을 잘 확인해봐야겠다.

'WarGame > 500 Project' 카테고리의 다른 글

(55/500) pwnable.kr - uaf  (0) 2017.07.12
(54/500) pwnable.kr - cmd1  (0) 2017.07.12
(52/500) pwnable.kr - coin1  (0) 2017.07.12
(51/500) pwnable.kr - shellshock  (0) 2017.07.11
(50/500) pwnable.kr - mistake  (0) 2017.07.10


Coin 1 !!

문제 이해가 늦었다.. ㅜ
Coin 문제이다/


(Coin1)


아래는 문제 화면이다.



(문제화면)



문제에 접속하면 게임이 나온다.


(게임 화면)



아마 이 문제를 이해못했던건 나만... 일수도 있지만..
혹시나 못하신 분들을 위해 저의 시선으로 설명!

1. 가짜 코인을 찾는게 목표!
2. N -> 코인의 개수, C -> 무게를 잴수 있는 기회
3. C가 기회라고는 하지만 C번 무게를 잰 후에 답을 말해야한다.
4. N 이 주어지면 그에 해당하는 인덱스를 지정해주면 그 코인들의 무게를 재서 알려준다.
예를들어
N =6 이다 하면.
0, 1, 2, 3, 4, 5    이렇게 동전이 있는 것이다.

내가 0번 3번 5번 코인을 선택해서 0 3 5   이렇게 입력해서 보내면
0 3 5  코인의 무게를 합해서 알려준다. 요론식으로 해서 가짜 코인을 찾는 것!

아래는 나의 파이썬 코드이다.
나의 생각 그대로 코드로 옮겨두었기에 정리가 산만하다.



(해결 코드)




(해결 코드)



100개의 코인을 모으는 것은 순식간이다.
문제 해결!


(문제 해결)

'WarGame > 500 Project' 카테고리의 다른 글

(54/500) pwnable.kr - cmd1  (0) 2017.07.12
(53/500) pwnable.kr - blackjack  (0) 2017.07.12
(51/500) pwnable.kr - shellshock  (0) 2017.07.11
(50/500) pwnable.kr - mistake  (0) 2017.07.10
(49/500) pwnable.kr - leg  (0) 2017.07.10


문제를 풀면서 많은 것을 찾아보고 알게 되어 기쁘다. :)

이번 문제는 shellshock 이다.



(shellshock)


문제 화면은 아래와 같다.



(문제 화면)



문제의 키워드는 shellshock이다.
shellshock를 기사공부할 때 공부했었다.
환경변수를 이용해 명령어를 Injection 시키는 공격이라고 공부를 했는데
직접 해보지는 못했었다.

직접 찾아보면서 더 깊이 이해하게 되었다. :)

먼저 문제 접속하여 파일들을 보자.



(문제 접속)


특이점은 bash가 있다는 것이다.

코드를 보자!


(shellshock.c)



쉘쇼크 소스코드이다.
시스템함수로 bash를 실행시킨다.

쉘쇼크를 검색하면 제일 많이 나오는 것이 아래와 같은 진단코드이다.



(쉘쇼크 진단 코드)



vulnerable이 뜨면 취약한 점이라고 하는데 안뜬다..
취약하지 않은건가??

여기서 많이 찾아보게 되었는데
아주아주아주 정리를 잘해주신 블로그를 발견했다. 쉘쇼크의 원리를 빠삭하게 설명해주셨다.

바로 쉘쇼크의 근간은 Bash가 subshell을 실행시키면서 일으키는 버그이다.

예를 들면 export로 환경변수를 설정해보자.



(환경변수 설정)



위의 attack은 변수로 설정 되었다. Bash에서는 함수로 환경변수를 설정할 수 있다.
하지만 저 위의 attack은 쿼터로 둘러싸인 문자열 변수이다.!
(실행은 안된다!)

하지만! export로 선언한 변수는 subshell에서도 적용이 되는데 이 때 버그가 발생한다.

서브쉘로 bash를 열고 attack 함수를 실행해보자.



(함수 실행)



함수가 실행되었다???
문자열인데????

이건 바로 subshell을 실행시킬 때 환경변수 초기화 작업이 있는데 이 때 문자열 안에 있는 것들을 함수로 인식해 설정해버린다는 것에 있다.
더 흥미진진한 것이 있다.

{ ~~ } ; 추가 명령들
{} 안의 내용이 함수로 설정이 되고 그 다음에 추가명령들을 입력하면 이것들이 실행된다.
함수를 실행시키지 않아도 bash 초기화 작업중에 일어난다.
bash 환경변수 초기화 작업에 환경변수에 있는 내용들을 파싱하는 과정에서 입력값을 체크하지 않는 데 서 발생하는 취약점이다. 즉 여기서 echo attack!!! 을 함수로 설정하고 
/bin/cat ./flag 를 명령어 추가로 던져서 설정해보자.


(환경변수 설정)



그 후 shellshock를 실행시키면 된다. 코드 안에 bash를 실행시켜주니 알아서 읽을 것이다.
게다가 setgid가 설정되어있어 읽을 수 있다.



(문제 해결)


'WarGame > 500 Project' 카테고리의 다른 글

(53/500) pwnable.kr - blackjack  (0) 2017.07.12
(52/500) pwnable.kr - coin1  (0) 2017.07.12
(50/500) pwnable.kr - mistake  (0) 2017.07.10
(49/500) pwnable.kr - leg  (0) 2017.07.10
(48/500) pwnable.kr - random  (0) 2017.07.06


이번에 풀어본 문제는 mistake!



(mistake 문제)



아래는 문제화면이다.



(mistake 문제화면)



일단 로그인!
소스코드를 살펴보자



(소스코드)



소스코드를 보니 내가 읽을 수 없는 파일을 읽어서 그 값과 내가 입력한 값을 비교하고 있다.
어떻게 맞추지...

그런데 문제 화면에서 진지하게 생각하지말라고 나와있다. 단순한 실수라고
연산자 우선순위 실수?
아무리봐도 특별한 연산자가 없는거 같은데... 괄호를 잘 뒤져봤다.

?!?!?!?


(이상함 발견)



이상함이 발견되었다.
fd에 들어가는 값이 open 이 아니라 bool 연산값?? password 파일의 fd가 0보다는 클테니...
이 비교는 거짓이 되고 고로 fd에는 0이 들어가게 된다..

fd 0은 표준 입력이다.
즉 내가 입력한 표준 입력과 비교하는 것이다. 오케이!

내가 패스워드로 입력한 값을 xor 연산 해주므로 그 함수를 고대로 복붙해서
내가 입력할 것을 넣어서 비교해본다.



(xor)


내가 A 10개를 입력할 것이므로 xor 하면 @ 10개가 된다. 즉 표준입력으로 @ 10개를 입력하고
패스워드로 A 10개를 입력한다.

exploit을 만들어보자.


(exploit 코드)


그 전전 문제에서 표준입력하는 방법을 배워서 여기서 써먹을 수 있었다.

@10개를 입력한 후, A 10개를 입력해준다.! 구분자는 \n 개행으로 하였다.


(문제 해결)



문제해결!


'WarGame > 500 Project' 카테고리의 다른 글

(52/500) pwnable.kr - coin1  (0) 2017.07.12
(51/500) pwnable.kr - shellshock  (0) 2017.07.11
(49/500) pwnable.kr - leg  (0) 2017.07.10
(48/500) pwnable.kr - random  (0) 2017.07.06
(47/500) - pwnable.kr - passcode  (0) 2017.07.06


leg 라는 문제이다.

지금껏 Intel 기반의 어셈블리를 보았는데
이번에는 다른 기반의 아키텍쳐 ARM을 보게된 계기가 되었다.



(leg 문제)



leg 문제 화면이다.



(leg문제 화면)



들어가보면 leg라는 프로그램과 flag 파일이 있다.



(leg 문제 접속)


처음보는 ARM 어셈블리지만 함수의 리턴값이 어떻게 넘어오는지 확인하기 위해 소스 asm 코드를 보았다.



(leg.asm)



함수를 호출하고 r0 레지스터의 값을 옮겨 담고있는 모습을 포착하였다.
r0 레지스터에 리턴값을 던지는 것 같다.

그렇다면 우리는 이제 r0를 추적하면 된다.



(key1)



먼저 Key1
pc 값을 r3에 넣고 그 값을 r0에 넣는다.
pc라는 것을 찾아보니 Program Counter 레지스터라고 다음 실행할 명령어의 주소를 담고 있는 레지스터라고 되어있다.
그렇다면 pc를 담고 있는 명령어에서 다음 주소는 8ce0 이므로 key1 = 8ce0

그 다음 Key2


(Key2)



pc값을 r3에 넣고 4를 더한다.
즉 r0 = 8d06 + 4

마지막 Key3


(key3)



lr 이라는 것을 살펴보니 함수가 호출되기 전에 복귀 주소를 lr 레지스터에 저장하고 넘어온다고 한다.
ARM 에서는 함수 호출할때 스택을 쓰지않고 lr 레지스터를 이용하나보다.



(lr 값)



복귀 주소를 확인!

이 값을 전부 더해주면 끝!



(오답)



틀렸다...

아무리 생각해도 맞는데.! 틀린게 있다면 pc값 계산이었을까?

찾아보니 ARM에서 pc값 계산이 조금 다르다.
ARM에서는 명령실행할때 단계가 4단계가 된다.
fetch -> decode -> execute -> write

예를 들어 1 -> 2 -> 3 이라는 명령어가 있고
1 명령어가 execute 단계라면
그 다음 명령어 2는 decode 단계에 있고
그 다다음 명령어 3는 fetch 단계에 들어서게 된다.

pc는 fetch 할 주소를 담고 있다.

key1의 pc 값 계산을 다시보면



(key1 pc값)



0x00008cdc 의 주소가 실행 단계에서 pc값을 r3에 넣는 것이다.
여기서 0x00008ce0 주소는 decode 단계이고
0x00008ce4 의 주소가 fetch 될 주소이다. 
그러므로 fetch될 주소인 0x00008ce4의 주소가 pc값이 된다.

이런식으로 계산을 하게 되면 정답을 찾을 수 있게 된다.



(문제 해결)

'WarGame > 500 Project' 카테고리의 다른 글

(51/500) pwnable.kr - shellshock  (0) 2017.07.11
(50/500) pwnable.kr - mistake  (0) 2017.07.10
(48/500) pwnable.kr - random  (0) 2017.07.06
(47/500) - pwnable.kr - passcode  (0) 2017.07.06
(46/500) - pwnable.kr - flag  (0) 2017.07.05


random 이라는 문제이다!



(random 문제)



문제 화면은 아래와 같다.



(문제)



랜덤함수를 이용한 프로그래밍을 했다니 확인해보자

소스코드!


(소스코드)



음 내가 입력한 값과 랜덤값을 XOR하여 저 값이 되게하는 거니까
키 값은 deadbeef XOR 랜덤값을 한 값을 입력하면 되겠군

근데 랜덤값을 어떻게...
오버플로우 문제인가??

내 Centos에 옮겨서 gdb로 돌려보았다. 반복하면서 돌려보다가 엥?

랜덤값이 항상 0x6b8b4567 이 나오는 것이었다.



(같은값)



확인해보니 rand() 함수만 이용하면 항상 같은 값이 나온다는 거였다.

그래서 seed 주어 난수를 생성하는 것이었다. 여기서 조금 의아했던 것은 과연 이게 문제 사이트 시스템에서도 같은 값일까 였다.

내가 알아낸 값과 deadbeef를 XOR해주면 내가 입력해야할 key값이 나온다.



(key구하기)



그리고 결론은 성공!



(문제 해결)



'WarGame > 500 Project' 카테고리의 다른 글

(50/500) pwnable.kr - mistake  (0) 2017.07.10
(49/500) pwnable.kr - leg  (0) 2017.07.10
(47/500) - pwnable.kr - passcode  (0) 2017.07.06
(46/500) - pwnable.kr - flag  (0) 2017.07.05
(45/500) - pwnable.kr - bof  (0) 2017.07.05

+ Recent posts