[Protostar] Format3
About
This level advances from format2 and shows how to write more than 1 or 2 bytes of memory to the process. This also teaches you to carefully control what data is being written to the process memory.
This level is at /opt/protostar/bin/format3
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int target;
void printbuffer(char *string)
{
printf(string);
}
void vuln()
{
char buffer[512];
fgets(buffer, sizeof(buffer), stdin);
printbuffer(buffer);
if(target == 0x01025544) {
printf("you have modified the target :)\n");
} else {
printf("target is %08x :(\n", target);
}
}
int main(int argc, char **argv)
{
vuln();
}
format2번 문제와 printf(buffer)에서 포맷스트링버그가 발생한다는 점이 동일한데
target 값이 64에서 0x01025544로 바꿔 주어야 한다는 점이 차이점이다!
👉 이번에는 target값을 0x01025544로 바꿔주면 될거 같다!
1. target 주소 구하기
objdump -t ./format3 | grep target
👉 0x080496f4
2. 이제 기존방법과 동일하게 입력값에 AAAA와 %x를 주어서 AAAA가 시작하는 곳을 찾는다.
3. target주소를 0x01025544로 변조하는 방법으로 두 가지가 있다.
1) 첫 번째 방법 : 앞에 공간을 0x01025544만큼 주어서 변조하는 방법이다.
0x01025544를 10진수로 바꾸면, 16930116 이다.
...
16930116을 바로 넣으면, 위와 같을 결과가 나오고,
안 맞는 값만큼 조절해서 값을 넣어주면 변조가 되었다!
...
2) 두 번째 방법 : target을 2바이트씩 잘라서 변조한 값을 넣어주는 것이다.
0x080496f4 | 0x080496f5 | 0x080496f6 | 0x080496f6 |
0x44 | 0x55 | 0x02 | 0x01 |
우선, AAAA, BBBB, CCCC, DDDD를 주어서 아래와 같이 만들면, 65가 나온다. 44가 되어야 하는데 그러면 144로 만들어서 44를 만족시키면 된다. 어차피 다음에 다시 덮어써지기 때문이다.
이렇게 한 자리씩 덮어씌우면, 성공