글
FTZ level11 write up

cat 명령어를 사용해 우선 hint먼저 살펴본다.
힌트를 보면, argv[1]의 값을 str에 복사해준 후 출력을 해 주는데,
strcpy함수가 취약하다는 것을 알 수 있다.
strcpy : 문자열을 복사하는 함수
ex)
char* strcpy(char* dest, const char* origin);
:orgin에 있는 문자열을 dest로 복사한다
왜냐하면 argv[1]의 크기를 제한하지않고 바로 복사하기 때문이다.
그래서 256byte를 넘는 데이터를 str에 복사할 수 있게 된다!
이것은 버퍼오버플로우를 일으킬 수 있게 한다.

그런데 여기 hint말고 attackme라는 파일이 있다. 되게 수상하다!
버퍼오버플로우 공격을 할 떈 변수의 크기와 위치를 잘 파악하고 있어야 한다!
그러니까 level9에서 했던 것처럼 gdb로 attackme를 분석해보자!

strcpy 함수가 수상하니까 그부분만 보자!
<main+27> 에서부터 <main+48>까지만 보면 될 것 같다.
하지만 봤는데 딱히 뭐 보고 알 수 있는게 없는 것 같다
그런데 생각해보니까
eip에는 다음에 실행하여야 할 명령어가 존재하는 메모리 주소가 저장된다.
ret다음에 eip가 다음으로 실행될텐데
eip에 쉘코드를 넣으면 ret다음에 쉘코드가 바로 실행되지 않을까?
RET 부분에 환경변수의 쉘코드를 넣으면 뭔가 될 것 같다.˘ᗜ˘
이 쉘코드를 환경변수에 저장을 하고, 쉘코드가 저장되어 있는 주소를 ret에 넣어 쉘을 얻어와보자!
쉘코드 : \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80

export 명령어를 사용하여 환경변수에 쉘코드를 저장한다

env 명령어를 통해 잘 되었는지 확인!
이제 jh의 주소를 알아내어 이걸 ret 에 넣는 일만 남았다.

주소를 알아내기 위한 jh.c 파일을 만든다!

컴파일 시키고 실행시킨다! 그러면
0xbffff8f라는 주소값을 얻을 수 있다!!

스택 기반의 버퍼오버플로우에서 가장 중요한 것은 RET 값을 변조하는 것이다!
그래서 버퍼오버플로우가 일어나는 배열에서 RET값이 저장되는 공간 까지의 거리를 구해야한다!
그러니까 우리는 ret전 까지 268만큼 아무 값을 넣어주면 된다. (づ ̄ ³ ̄)づ

일일이 다 268만큼을 넣을 수 없으니 한줄로 저렇게 만든다!
level12의 패스워드 값을 얻었다!>_<
+
mov : Source에서 Destination으로 데이터를 복사한다.
add : Destination에 Source의 값을 더해서 Destination에 저장한다.
sub : Destination에 Source의 값을 빼서 Destination에 저장한다.
push : 스택에 값을 넣는다. ESP의 값이 4만큼 줄어들고 이 위치에 새로운 값이 채워진다.
pop : ESP 레지스터가 가리키고 있는 위치의 스택 공간에서 4byte 만큼을 Destination 피연산자에 복사하고 ESP 레지스터의 값에 4를 더한다.
레지스터
eax : 산술, 논리연산을 수행한 값이 저장되며 함수의 리턴값이 저장됨.
eip : 다음에 실행하여야 할 명령어가 존재하는 메모리 주소가 저장됨.
ebp : 스택의 시작지점 주소가 저장된다. (스택의 처음 부분)
esp : 스택의 마지막부분을 저장하며, push, pop 에따라 4씩 값이 변한다.
출처: https://includestdlib.tistory.com/43 [stdlib]
'포너블' 카테고리의 다른 글
| (달고나) 와우해커 BOF 정리 [1] (0) | 2020.03.10 |
|---|---|
| FTZ level9 write up (0) | 2020.02.28 |
| FTZ level8 write up (0) | 2020.02.26 |
| FTZ level7 write up (0) | 2020.02.26 |
| FTZ level6 write up (0) | 2020.02.26 |