System hacking/pwnable.xyz

[pwnable.xyz] Welcome 문제

Roronoa 2022. 9. 26. 02:44
반응형

Welcome 문제

https://pwnable.xyz/challenges/

 

pwnable.xyz

If all pwnables could be just note taking, menu driven, x86 binaries...

pwnable.xyz

위 사이트에서 해당 문제를 풀 수 있다.

문제 설명

[그림 1] 문제 실행

해당 문제를 실행하면 Welcome이라고 반겨주고 어떤 주소를 Leak한다.

메시지의 길이를 입력하고 메시지를 입력하면 입력한 문자열을 다시 출력해주는 프로그램이다.

 

[그림 2] gdb 실행

disas main이 안된다. - 1차 멘붕 -

그리고 function을 살펴봐도 메인이없고 아무것도 안나온다. - 2차 멘붕 -

checksec을 해봤지만 set logging enabled라고 뜬다. 뭔소리인지 모르겠지만 main화면은 안보인다.

구글링을 해보니 main함수 실행전에 __libc_start_main함수가 먼저 실행되고 _start함수가 더 먼저 실행된다고 한다.

_start => __libc_start_main => main 순이다.

그래서 start함수와 libc start main함수를 찾아도 안나온다.

 

[그림 3] ida 디컴파일

ida로 디컴파일하여 확인하니 속 편하다.

그래도 gdb로 볼 수 있는지 구글링을 해보겠다.

 

-- 구글링 중 --

[그림 4] vmmap 사용

먼저 start한 후 vmmap이라는 명령어를 사용하면 매핑된 메모리의 정보를 볼 수 있다.

Start함수의 첫번재 부분이 base주소라고 한다. 베이스 주소에서 아이다에서 main화면의 offset과 더하면 main화면이 나온다고 한다. (메인함수 오프셋 : 0x920)

 

[그림 5] gdb로 main함수 찾기

오호라 main함수를 찾았다. (아이다랑 똑같음)

분석을 해보면 malloc으로 40000만큼 할당을 받았다. 그리고 rax에 1을 넣고 printf로 rax의 주소를 출력하는 것 같다.

 

[그림 6] gdb 분석

malloc이 scanf로 입력받은 값을 할당한다.

cmp 부분에서 rbx의 값이 0이면 system 함수를 호출하여 flag를 읽을 수 있다.

위에보면 mov [rbp+-rdx*1 -0x1], 0x0이라는 코드가 있는데 rbp를 확인해 보면 입력한 문자열이 들어가고 rdx는 입력한 size의 크기가 들어간다.

이 값을 조정하면 rbx의 값을 조정할 수 있을 것이다.

malloc에서 size값을 엄청나게 크게 넣으면 malloc에 실패 해 할당을 받지 못해서 0이 된다고 한다.

leak한 주소의 값이 엄청 크기 때문에 할당받지 못할 것 이다.

따라서 rdx에 leak한 값 + 1을 넣으면 leak+1-1이므로 leak한 위치에 0을 넣게 되고 rbp는 어차피 0이라서 상관안써도 된다.

바로 poc코드를 작성하도록 하겠다.

 

[그림 7] POC코드 작성

int(p.recv(14), 16)으로 leak의 주소를 불러와 스트링인 leak주소값을 int값으로 변경시켜주었다.

그리고 scanf의 입력 값으로 leak + 1로 str형태(scanf는 str으로 받음)로 보내주었다.

마지막으로 아무값을 보내면 완성이다.

 

[그림 8] flag 출력

poc코드를 전송하고 flag를 획득하였다.

pwnable.xyz 1번문제 Welcome문제부터 엄청 어렵다. Welcome하지 못하네~~^^

반응형