[Protostar] Format1
About
This level shows how format strings can be used to modify arbitrary memory locations.
Hints
- objdump -t is your friend, and your input string lies far up the stack :)
This level is at /opt/protostar/bin/format1
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int target;
void vuln(char *string)
{
printf(string);
if(target) {
printf("you have modified the target :)\n");
}
}
int main(int argc, char **argv)
{
vuln(argv[1]);
}
printf(string) 가 포맷스트링버그가 발생하는 곳이다.
👉 인자값으로 %n, *target 이렇게 주면 %n까지의 문자길이가 target으로 저장이 되는 원리를 이용하면 된다.
👉 if(target)이므로 target변수가 바뀌기만 하면 된다.
1. 우선 target의 위치를 알기 위해서 format1 파일을 gdb 한 다음
disass vuln 으로 내용을 보면,
test eax,eax로 이곳이 if함수가 시작되는 곳이고
인자값 eax에 0x8049638이 들어가는 것을 통해 이곳이 target의 주소인 것을 알 수 있다.
2. 포맷스트링버그를 확인하기 위해서 인자로 %x를 주면 다음과 같다.
3. 그러면 인자값으로 "AAAA"를 주고 %x를 여러 번 출력하여 메모리 값으로 414141을 만날 때까지 출력을 한다.
그러면 414141이 들어간 곳을 확인할 수 있다.
4. 그다음에 414141 위치를 조절해서 정확하게 파악해야 한다.
최대한 줄이면 130정도가 되는데 그 뒤에서다 target 주소를 넣어준다.
5. 129개까지 %x를 넣고 130번째에 %n을 넣어준다. 근데 이렇게 바로 출력하면 segmentation 오류가 발생한다.
주소로 변환되면서 한 블록 안에 다 들어갈 수 없기 때문이라고 한다. %x을 뒤에 붙여서 오류가 나지 않도록 한다.
6. 성공!
/format1 $(python -c 'print "AAAA"+"\x38\x96\x04\x08"+"%x."*128+"%n."+"%x."')