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