문제는 리눅스 input 문제이다.

일단 소스코드 바로 열람 ㄱㄱ


소스코드가 기니 GitHub로 옮김..


소스코드를 해석해보면

너무 길다... 아 하기싫어라..


그냥 하나하나 맞는 해답을 익스플로잇 코드(??)식으로 만들어 줘서 실행시켜야 한다.

저기서 stage1 부터 argv를 100개를 입력해야하는데... 실제로 입력할수가 없으니 =_=..


익스플로잇 코드는 /tmp경로에 직접 짜야한다.. 하지만 검색하면 많이나오니 패쓰

나같은 경우에는 /tmp/manvan 디렉토리에 짯다.




-------------------------

16.09.24

stage5가 클리어가 안되는 문제가 발생중.. 트러블 슈팅 보류

'Pwnable > Pwnable.kr' 카테고리의 다른 글

Pwnable.kr random 풀이  (1) 2016.09.23
Pwnable.kr passcode 풀이  (0) 2016.09.23
Pwnable.kr flag 풀이  (0) 2016.09.22
Pwnable.kr bof 풀이  (0) 2016.09.22
Pwnable.kr collision 풀이  (0) 2016.09.12


일단 1점짜리 문제다... 그리고 랜덤값을 프로그램에 넣는 방법을 알려달라(?)고 한다.


바로 ssh로 접속



디렉토리 내용은 역시나 소스코드, 프로그램, 플래그 3개

바로 소스코드를 보고 해석해보자


random변수에 난수를 넣고. key변수에 값을 입력받는다.

그리고 key와 random 값을 XOR해서 0xdeadbeef 값이 나오게 해서 flag값을 얻어야한다.


그전에 이 프로그램은 rand함수에 취약점이 있다는 것을 바로 눈치채야한다.

왜냐하면 저렇게 하면 매번 같은값이 생성되기 때문이다 진짜 랜덤값을 얻고자 한다면 srand(time(NULL))을 써야한다.


그러면 답이 나왔다. random변수의 값을 찾으면 되겠다.

그 다음에 0xdeadbeef값과 XOR시키면 페이로드로 넣을 값을 구할것이다.


바로 공격을 해보자



random변수의 위치를 찾기위해 main+18번 라인에 BP를 걸어준다. 이유는 rand함수를 거친뒤의 random변수를 가리키기 때문이다.

BP를 걸고 디버그작업을 시작한다.



그리고 나서 여기서는 rax에 값을 봐주자.

저곳이 rand함수를 거친 random변수의 값이다.



이제 XOR시켜주자

그러면 10진수로 3039230856이 나오고,



키 값 나옴

'Pwnable > Pwnable.kr' 카테고리의 다른 글

Pwnable.kr input 풀이(보류)  (0) 2016.09.24
Pwnable.kr passcode 풀이  (0) 2016.09.23
Pwnable.kr flag 풀이  (0) 2016.09.22
Pwnable.kr bof 풀이  (0) 2016.09.22
Pwnable.kr collision 풀이  (0) 2016.09.12


문제 해석을 먼저해보자..

로그인 시스템을 기반으로한 passcode프로그램이다. 아무 에러없이 C코드가 컴파일이 되었다. 근데 컴파일에 경고가 있었다.



바로 접속후 디렉토리 확인.

C 코드를 확인해보자



아 길다 ㅆㅃ

앞에서 힌트로 주어진 "warning이 발생했다"를 한번 해석해보면 소스코드는 컴파일이 되었으나 경고가 떠 제대로 작동을 하지 않는다는 뜻이다. 소스코드를 쭉 보다보니 대부분의 scanf에 문제가 있는 것을 확인 할 수 있다.


이 부분을 길게 먼저 설명하겠다.

scanf는 char를 제외한 int형이나 그 등등 scanf("받을형식", 변수주소값)으로 사용된다.

char변수형인 경우에는 초기값과 주소값이 동일하기 때문에 &를 붙이지 않아도 되나.. int형은 &를 붙여주지 않으면 황당한 결과가 발생한다. 예를 들어 scanf("%d",a)라고 썻다면 a라는 주소에 값을 넣는다는 뜻이다. a를 a주소 자체로 생각해버리기 때문이다.


그 다음 문제점이다. login()함수 내에있는 fflush(stdin)부분!

이 부분 때문에 우리가 정상적으로 프로그램을 실행하고 올바르게 입력해도



세그먼테이지 폴트가 반환되는 문제가 발생한다.

저 함수로 인해 우리가 위와같이 올바른 패쓰워드를 입력했다해도 실제로 저장되어버리는 값은

passcode1=338150 / passcode2=\n 이다.

이런 일이 일어나는 이유는 소스상으로나 윈도우 상에서는 문제가 되질 않는다.

다만 리눅스에서는 조금 다르게 작동하고, fflush(stdin)은 공식적인(?) 표준이 아니다.

이 녀석은 리눅스에서는 아무런 기능(개행"\n"을 삭제)을 할수 없다.


이 점들을 숙지하고 다음으로 넘어가자



우리가 입력할 수 있는 버퍼를 계산하기 전에 어셈코드들을 확인해보자. 위 스샷은 welcome과 login사이에 별다른 입출력(PUSH/POP)이 일어나지 않는다.

이 곳은 첫번째 passcode1을 입력하는 부분이다.

이 부분을 어셈코드로 보면



상단의 스샷처럼 ebp-0x10 부분이다.



그다음 welcome()함수에서 처음으로 입력받는 부분인 name입력부분이다. 

여기서는 name변수가 100만큼이다.



어셈코드로 보면 ebp-0x70부분에 name함수의 시작부분이 보인다.


최종적으로 우리가 더미로 채워야하는 부분을 계산하면 0x70~0x10사이가 되고 크기를 10진수로 변환하면

96만큼의 더미를 먼저채워야한다.


그리고 페이로드를 짜보자.

우리가 소스코드는 고칠수가 없으니, passcode1 입력 부분을 GOT(Global Offset Table)exit의 GOT로 바꿔서 우회해야한다.

exit의 GOT는 readelf -r passcode 명령어로 확인을 하면 아래 스샷과 같이 볼 수 있다



그리고 exit으로 빠져나올 뿐만아니라 system("/bin/cat flag")을 실행시켜야 하므로

system("/bin/cat flag")가 있는 주소를 찾아보면 아래 스샷과 같이 찾을 수 있다



0x08045e3주소에 있다는 것을 확인할 수 있다. 그리고 여기서는 주소가 아닌 정수를 넣어야 하므로 10진수로 변환하면

134514147이 나오는 것을 확인할 수 있다. 그리고 passcode2로 인해 세그먼테이지 폴트를 안띄우게 하기위해 문자 하나이상 입력한다


최종 페이로드는 파이프라인으로 작성하여서 (perl -e 'print "A"x96,"\x18\xa0\x04\x08","134514147","a\n"'; cat)| ./passcode

가 되고 키값이 나오는 것을 확인






추가적으로 이게 10pt짜리입니다.. 꽤나 어려워서 이해하는데 하루정도 걸린거같네요...

만약 누락된 설명이 있다면 추가보충할 예정

'Pwnable > Pwnable.kr' 카테고리의 다른 글

Pwnable.kr input 풀이(보류)  (0) 2016.09.24
Pwnable.kr random 풀이  (1) 2016.09.23
Pwnable.kr flag 풀이  (0) 2016.09.22
Pwnable.kr bof 풀이  (0) 2016.09.22
Pwnable.kr collision 풀이  (0) 2016.09.12

문제는 리버싱인듯하다. 우선 wget을 통해 칼리리눅스에 다운로드 받아보자



malloc()을 쓰며 strcpy로 플래그를 복사? 할것이라고한다.

일단 리버싱이니 윈도우로 옮기겠다.

윈도우로 옮기고

IDA를 통해 열어보겠다.

리눅스 실행파일인것으로 확인



그러나 분석이 되질 않는다..




근데 여기에 upx라는 키워드가 보인다.

그렇다면 upx패킹이 되어있다는 것을 짐작할 수 있고, 한번 언패킹해보겠다. 



언패킹후 재분석을 해보자



분석이 잘 되었다


이제 키값을 뒤져보면 malloc 함수와 flag라는 변수(?)가 보인다.


flag를 더블클릭해보자



키값이 발견되었다!

'Pwnable > Pwnable.kr' 카테고리의 다른 글

Pwnable.kr random 풀이  (1) 2016.09.23
Pwnable.kr passcode 풀이  (0) 2016.09.23
Pwnable.kr bof 풀이  (0) 2016.09.22
Pwnable.kr collision 풀이  (0) 2016.09.12
Pwnable.kr fd 풀이  (0) 2016.09.11


문제다. 말그대로 버퍼 오버플로우를 일으키는 문제

이 문제를 풀려면 칼리리눅스를 깔고 칼리리눅스에서 문제해결하는것을 권장한다



우선 bof.c를 다운로드 받고 소스코드를 읽어보자

func함수가 있고 밑에 main에는 func함수에 0xdeadbeef라는 인자를 넘겨준다.


바로 분석을 하자. gdb -q bof를 입력하고(같이 다운받을거리라 안다)

set disassembly-flavor intel

disas main

disas func

를 하여서 각각의 어셈코드를 확인하고, 간단하니 빠르게 문제를 풀어보자.



저기서 밑줄친것만 유의하면된다.

소스코드와 대조해보았을때 func부분을 확인하면

첫번째는 printf함수에 대한 내용이고, ebp-0xc에는 overflow me... 라는 문구가 들어가 있다.

두번째는 gets함수에 대한 내용이고, ebp-0x2c에는 overflowme변수가 시작되는 부분이다.

마지막으로 세번째는 if에서 조건문에 들어가는 부분이고, 0xcafebabe와 ebp+0x8를 비교하는 것이다.


그럼 여기서 추론이 가능한 것이

ebp+0x8에서 비교를 비교를 하고

ebp-0x2c에서 overflowme변수에 값이 들어가게된다.


그렇다면 저 두공간의 차이만큼

0x8-(-0x2c)=0x34(52바이트)만큼의 공간을 쓰레기로 채우고 0xcafebabe를 채우면 된다.


최종적인 페이로드는 파이썬으로 작성하며 argv인자로 받는게 아니므로 파이프라인으로 작성하게 되니

(python -c 'print "A"*52 + "\xbe\xba\xfe\xca"' ; cat) | ./bof 가 될것이다.

그리고 nc pwnable.kr 9000에서 테스트를 하라고 했으니, nc로 걸어둔 것이 bof파일일것이다. 통상적으로는..


그러므로 

(python -c 'print "A"*52 + "\xbe\xba\xfe\xca"' ; cat) | nc pwnable.kr 9000 를 입력


해결



'Pwnable > Pwnable.kr' 카테고리의 다른 글

Pwnable.kr random 풀이  (1) 2016.09.23
Pwnable.kr passcode 풀이  (0) 2016.09.23
Pwnable.kr flag 풀이  (0) 2016.09.22
Pwnable.kr collision 풀이  (0) 2016.09.12
Pwnable.kr fd 풀이  (0) 2016.09.11

+ Recent posts