level 19
2020. 9. 10. 18:22
스택, LD_, 공유 라이브러리, 라이브러리 함수, 바이너리 코드. 여러가지를 못쓰네요.
보통 argv[1]을 사용할 때는 main 함수 프롤로그에서 main 함수보다 먼저 push 된다는 사실은 이미 수없이 접해왔기 때문에 알 수 있었습니다.
하지만, stdin을 통해 입력을 받는다면 어디에 저장되어있다가 buffer로 복사될까요?
인자를 보면 알 수 있습니다.
딱봐도 stdin => buffer로 들어가게 되는데요.
stdin을 gdb 도구를 통해 알아봅시다.
제일 처음 들어오는 인자인 0x8049a3c라는 위치가 stdin을 가리키는 위치인 것 같네요.
A 100개를 넣고 돌려보겠습니다.
아까 그 주소를 확인했더니, stdin이라는 문구에 0x401068c0이라는 값이 들어있었습니다.
또한 0x401068c0을 다시 확인해보니 문자열로 보이는 값들, 400으로 시작하는 주소가 세개 있었습니다.
첫번째는 빈문자열, 두번째가 제가 입력한 문자열이었습니다.
즉, 입력한 문자열은 0x40015000에 저장되어 있다가 buffer로 복사되는 것이었습니다.
과연 이 문자열이 프로그램 종료 직전에도 남아있을까요?
남아있네요!
payload를 작성하겠습니다.
"\x90"*19 + "~~"(ShellCode) + "\x00\x50\x01\x40"
성공!