Pwnablekr_Rookiss_simple-login

nc를 이용해 접속한다. 링크를 통해 elf 파일을 받아 볼 수 있다.

프로그램 실행 모습이다. 입력을 받으면 해시를 출력한다.

main 함수 흐름이다. 주석에 로직을 해석해두었다.


0x080493D8, 0x080493DD의 코드에서 디코딩 된 문자열의 크기가 12바이트를 초과하는 경우 오류 문자열을 출력한다. 12바이트 이하라면 auth 함수를 호출하여 해시 값을 출력한다.

이 auth 함수에서 중요한 것은 memcpy이다.

입력값을 base64 디코딩하여 얻은 문자열의 최대 길이는 12바이트까지 가능한데, 버퍼 크기는 8바이트이다. 따라서 바로 밑에 있는 EBP backup을 조작할 수 있다.

이 문제의 경우 디코딩 결과가 전역변수에 저장된다. 그 주소는 0x0811EB40이다. EBP 백업을 조작하여 EBP가 이 곳을 가리키도록 할 것이다.
0x0811EB44 ~ 0x0811EB47 위치에 원하는 주소를 저장해둔다면 원하는 코드로 이동할 수 있게 된다. 이는 디코딩 된 문자열의 5번째~8번째 바이트가 저장되는 위치이다.

correct 함수에는 system 함수로 /bin/sh을 호출하는 코드가 있다.
EIP를 0x08049284로 옮기면 셸을 딸 수 있다.

위 조건에 맞는 파이썬 코드이다. 입력할 base64 인코딩 된 문자열을 구한다. 이는 QUFBQYSSBAhA6xEI 이다.

flag는 control EBP, control ESP, control EIP, control the world~ 이다.
tags: writeup, pwnable, elf file, linux, memory corruption, x86asm, stack overflow, fake ebp