이번에는 Protostar Stack1번 문제 풀이를 진행하겠다.
Protostar 문제는 다음 사이트에서 확인할 수 있다.
old.liveoverflow.com/binary_hacking/protostar/stack1.html
Stack 1 - LiveOverflow
This video introduces http://exploit-exercises.com, how to connect to the VM with ssh and explains what setuid binaries are.
old.liveoverflow.com
1. 문제 확인
문제를 보면 다음과 같이 설명이 나와있다.
이 수준에서는 프로그램의 특정 값으로 변수를 수정하는 개념,
그리고 변수가 메모리에 어떻게 배치되는지를 살펴본다.
if(argc == 1) { errx(1, "please specify an argument\n"); }
여기서 argc가 1개이면 걸린다. 뛰어쓰기로 구분하는 것 같다.
strcpy(buffer, argv[1]);
여기서는 argv로부터 데이터를 받는다.
strcpy는 취약한 함수라서 버퍼오버플로우가 많이 되기도 한다.
argument 뒤에 데이터를 넣어라는 의미이다.
실행이 된다. 여기서는 2개를 넘겼다.
여기서 argv[1]는 1234를 의미한다. stack1은 argv[0]이다.
전에도 언급했듯이 스택의 구조는 다음과 같이 나온다.
modified = 0;
modified 0을 세팅하고 한 번도 바뀐 적이 없다.
if(modified == 0x61626364) {
printf("you have correctly got the variable to the right value\n"); }
else { printf("Try again, you got 0x%08x\n", modified); }
그런데 바뀌는 것을 원하는 상황이다.
여기서 0x61626364 위치를 알아야 하는 상황이다.
그래서 gdb를 켜서 확인해본다.
여기서 cmp eax 0x61626364를 찾을 수 있다.
이 데이터는 modified로부터 가져왔 테니까
modified는 현재 esp+0x5c의 위치라는 것을 파악할 수 있다.
strcpy에서는 두개의 인자가 필요로 하는데,
eax에서 DWORD PTR(esp)에서 가져온 것을 확인할 수 있다.
buffer은 esp + 0x1c이다.
buffer = esp + 0x1c
modified = esp+0x5c
그래서 프로그래머용 계산기로 길이를 계산해보면 이렇게 나오는데,
10진수로 봐야 하니까
a를 64개 넣으면 modified 간다는 것을 확인할 수 있다.
그래서 이렇게 64개의 A를 넣어준다.
그런데 int가 4바이트이므로 추가로 BBBB를 넣어준다.
이를 넣고 실행하기 위해서 gdb ./stack1을 적어준다.
여기서 0x61626364의 위치가 main + 71번의 위치이다.
그래서 breakpoint를 b *main+71로 걸어주었다.
그 후 이렇게 값을 넣었다.
그런데 61626364가 나오려면 dcba가 나와야 하므로
A*64 + dcba를 넣어주었다.
그 후 info reg &eax를 확인하니 찾는 것인 0x61626364가 나오는 것을 확인할 수 있다.
continue를 통해
you have correctly got the variable to the right value를 출력할 수 있음을 한번 더 확인할 수 있다.
최종적으로 다음과 같이 넣으면 문제가 풀린다.
'security > 시스템' 카테고리의 다른 글
Protostar - Format 3 (0) | 2020.11.05 |
---|---|
Protostar - Format 2 (0) | 2020.11.05 |
Protostar - Format 0 (0) | 2020.11.03 |
Protostar - Stack2 (0) | 2020.09.22 |
Protostar - Stack 0 (0) | 2020.09.19 |
댓글