-
[Toddler's Bottle] 5번.[passcode]$ 시스템 해킹 $/pwnable.kr 2018. 12. 2. 11:09
이번에 풀어볼 문제는 pwnable.kr의 5번문제인 [passcode] 문제 입니다.
주요한 passcode.c 파일이 있네요 한번 확인해 보겠습니다.
코드를 살펴 보면 main() -> welcome() -> login() 이 순서대로 들어가는 것을 알 수 있습니다.
welcome()에서 이름을 입력 받은 뒤에 login()에서 passcode1,passcode2를 입력 받아서 if문으로 비교 해서 맞으면 /bin/cat flag를 실행 시키는 방식으로 이루어진 코드 인 것 같습니다.
한번 코드를 실행시켜서 338150와 13371337을 넣어보겠습니다.
Segmentation fault 즉, 세그먼테이션 오류가 나네요
그 이유를 보니 scanf에서 &가 없습니다.
&변수 형태가 변수가 들어있는 주소이고, 이 주소에 들어있는 값을 가져오는데, &가 없으면 변수자체를 주소로 인식하여 여기에 입력한 값을 가져오게 됩니다.
그래서 passcode1과 passcode2를 338150, 13371337과 비교하는 것이 안됩니다.
gdb를 이용해서 실행파일을 확인해 보겠습니다.
↑↑ main함수
↑↑ welcome함수
↑↑ login함수
welcome함수에서의 name변수는 ebp-0x70에서 부터 위치해 있고, passcode1변수는 ebp-0x10부터 위치해 있습니다.
따라서 실제 name변수의 크기는 0x70-0x10 = 112 - 16 = 96byte입니다.
여기 코드에서는 plt와 got를 사용합니다.
↑↑이처럼 말이지요.
plt과 got는 http://noisivohees.tistory.com/22 에서 공부하시면 됩니다.
( printf의 plt주소는 got영역의 주소를 가리키고 있다. 그리고 다시 plt 영역으로 돌아오는데 dl_runtime_resolver로 점프한다. )
그래서 \x90를 96개 먼저 채운 뒤에 GOT@exit의 위치를 더하고 flag를 구성하면 됩니다.
= (\x90*96)+(GOT@exit)+/bin/cat flag로 구성
-> got주소를 call해서 scanf변수로 들어가서 passcode1대신 입력을 받게 되는 것입니다.
일단 \x90 96개를 넣어야 한다는 점은 앞에서 알아냈고, got@exit의 위치를 찾아야합니다.
got@exit는 readelf 명령어를 이용해서 찾을 수 있습니다.
----------------------------------------------------------------------------------------
[readelf 명령어]
ELF파일 형식(실행가능한 파일)에 대한 정보를 보여준다.
옵션 :
-a | --all 모든 정보를 보여준다.
-h | --file-header 시작 위치에 있는 헤더 정보를 보여준다.
-l | --program-headers | --segment 파일의 세그먼트 헤더에 대한 정보를 보여준다.
-S | --sections | --section-headers section header 정보를 보여준다.
-s(소문자) | --symbols | --sym 파일의 심볼정보를 보여준다.
--dyn-syms 동적 심볼정보를 보여준다.
-e | --headers 모든 헤더정보를 보여줌 -h -l -s 와 같다.
-A | --arch-specific 특별한 아키텍처 정보를 보여준다.
----------------------------------------------------------------------------------------
plt의 주소는 08048410, got.plt의 주소는 08049ff4입니다.
x/50i 0x08048410 은 0x08048410주소부터 50줄의 어셈블리어를 출력하는 명령어 입니다.
exit@plt의 주소는 0x804a018입니다.
이번엔 login함수를 통해서 "/bin/cat flag"의 주소를 확인해봅시다.
/bin/cat flag가 있는 주소는 0x080485e3입니다.
0x0804a018는 16진수로 적었지만 /bin/cat flag의 주소는 10진수로 적었는데 그 이유는
scanf는 10진수로 받기 때문에 134514147을 적어준 것 입니다.
Flag는 Sorry mom.. I got confused about scanf usage :( 입니다.
'$ 시스템 해킹 $ > pwnable.kr' 카테고리의 다른 글
[Toddler's Bottle] 3번.[bof] (0) 2018.12.01 [Toddler's Bottle] 4번.[flag] (0) 2018.11.30 [Toddler's Bottle] 2번.[collision] (0) 2018.11.29 [Toddler's Bottle] 1번.[fd] (0) 2018.11.29