Welcome 문제
https://pwnable.xyz/challenges/
pwnable.xyz
If all pwnables could be just note taking, menu driven, x86 binaries...
pwnable.xyz
위 사이트에서 해당 문제를 풀 수 있다.
문제 설명
해당 문제를 실행하면 Welcome이라고 반겨주고 어떤 주소를 Leak한다.
메시지의 길이를 입력하고 메시지를 입력하면 입력한 문자열을 다시 출력해주는 프로그램이다.
disas main이 안된다. - 1차 멘붕 -
그리고 function을 살펴봐도 메인이없고 아무것도 안나온다. - 2차 멘붕 -
checksec을 해봤지만 set logging enabled라고 뜬다. 뭔소리인지 모르겠지만 main화면은 안보인다.
구글링을 해보니 main함수 실행전에 __libc_start_main함수가 먼저 실행되고 _start함수가 더 먼저 실행된다고 한다.
_start => __libc_start_main => main 순이다.
그래서 start함수와 libc start main함수를 찾아도 안나온다.
ida로 디컴파일하여 확인하니 속 편하다.
그래도 gdb로 볼 수 있는지 구글링을 해보겠다.
-- 구글링 중 --
먼저 start한 후 vmmap이라는 명령어를 사용하면 매핑된 메모리의 정보를 볼 수 있다.
Start함수의 첫번재 부분이 base주소라고 한다. 베이스 주소에서 아이다에서 main화면의 offset과 더하면 main화면이 나온다고 한다. (메인함수 오프셋 : 0x920)
오호라 main함수를 찾았다. (아이다랑 똑같음)
분석을 해보면 malloc으로 40000만큼 할당을 받았다. 그리고 rax에 1을 넣고 printf로 rax의 주소를 출력하는 것 같다.
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코드를 작성하도록 하겠다.
int(p.recv(14), 16)으로 leak의 주소를 불러와 스트링인 leak주소값을 int값으로 변경시켜주었다.
그리고 scanf의 입력 값으로 leak + 1로 str형태(scanf는 str으로 받음)로 보내주었다.
마지막으로 아무값을 보내면 완성이다.
poc코드를 전송하고 flag를 획득하였다.
pwnable.xyz 1번문제 Welcome문제부터 엄청 어렵다. Welcome하지 못하네~~^^