튜기's blogggg

FC3 gate->iron_golem

by St1tch



문제 코드를 보면 굉장히 간단하다.

하지만 FC3에서는 메모리 보호기법들이 적용된 문제들이여서 좀더 생각을 해야한다.

자세한 보호기법의 설명은 이론에 따로 포스팅 해놨기 때문에 생략한다.





스택의 주소가 계속 바뀐다.

aslr이 적용 되 있음을 짐작할 수 있다.




ascii-armor가 적용이 되어 라이브러리주소의 최상위 비트가 \x00이다.

그리고 nx가 걸려있어 스택영역의 실행권한도 없다.

따라서 쉘코드 없이 단 한번의 함수 호출로 이 문제를 풀어야된다.

이럴땐 exec* 계열 함수를 이용해 문제를 풀 수 있다.

그리고 다른 방법으로 ROP가젯은 아니지만 비슷한 느낌인 ret sleding을 이용하는 방법이있다.



우선 첫번째 방법으로 먼저 풀었다.

나는 execl이 익숙해서 이 함수를 이용해 문제를 풀었다.

execl( path, argv0, argv1, ... )

이런식으로 인자가 구성된다.


우선 hint에도 적혀있듯이 Fake EBP를 사용한다.

execl의 주소의 최상위 비트가 \x00이기 때문에 fake ebp를 이용해 적당한 값을 path로 넘겨줄것이다.


dummy + SFP(&path-8) + ret(&EXECL+3)

이러한 구조가 될 것이다. -8과 +3이 왜 있는지는 뒷 부분에 설명함






우선 execl의 인자를 계산하기 전에 스택구조를 먼저 파악했다.

buf는 ebp-264를 시작주소로 가진다.

따라서 exploit의 dummy는 264바이트이다.






이제 FakeEBP를 구해야 하는데, execl함수의 첫번째 인자에 들어갈 값이 FakeEBP+8의 주소에 있는 값이다.

첫번째 인자를 실행시키 때문에 이 fakeebp+8의 주소에 있는 값은 심볼릭 링크의 파일명이 된다.

따라서 짧을수록 간단하다.

여기서 got영역에서 적당한 값을 스캔했다.

(사실 0x08로 시작하는 영역들을 모두 시도해봤는데 .got.plt영역의 값에서만 쉘이 따졌다. 왜 그런지는 잘 모르겠다.)





got영역을 살펴보면 첫번째에 있는 주소의 값을 보면 1이다.

굉장이 간단하므로 이 값을 심볼릭 링크의 이름으로 했다.

여기서 exploit의 sfp자리에 넣을 값은 got의 주소인 0x08049618이 아닌 이 값에서 -8을 한 값이다.

execl이 실행이 되고 ebp+8에 있는 값이 첫번째 인자로 들어가게 되기 때문이다.





이렇게 권한을 설정하고 쉘을 실행시키는 간단한 코드를 짠 다음 심볼릭링크로 이름은 \x01로 만들어 준다.




이제 ret에 들어갈 execl의 주소를 구해야한다.

execl의 주소인 0x7a5720가 ret에 들어가는게 맞지만

지금 문제에서는 ebp를 속였기 때문에, execl함수가 시작될때 스택프레임이 바뀌면 안된다.

따라서 ebp가 바뀌게 되는 첫 두 명령을 skip하고 execl+3의 주소에 ret해야한다.






이제 exploit을 작성하기위해 필요한 모든 준비물을 찾았다.

찾은 정보를 토대로 공격코드를 작성하였다.




성공적으로 쉘이 따졌다






두번째 방법은 더 간단하다.



ebp 뒤쪽을보면 변하지 않는 값을 하나씩 관찰해보면 빨간줄 그어논 주소의 값이 \x00으로 끝남을 알 수 있다.

따라서 ret을 반복적으로해서 원하는 주소까지 간다음 execl함수를 실행시킬때 저 빨간색 인자를 첫번째 인자에 들어가게끔 하면된다.

빨간색 주소는 ebp+24의 주소이고, 이 값이 첫번재 인자에 들어가기 위해 execl의 주소는 ebp+16에 들어가야한다.

따라서 ebp+4,8,12에는 ret주소로 채워 sledding을 태워준다.

rop가젯에서 strcpy와 ppr을 태워주는 것과같이 strcpy와 pop이 없다고 생각하면 이해가 쉽다.





위의 ret 주소중에 아무거나 사용하면 된다.





첫번째 방법과 다른점은 dummy크기가 +4됬다는것 (fake ebp가 아니기 때문에)

execl+3에서 execl로 바뀐것(ebp를 속이는 것이 아니기 때문에 스택프레임이 생겨도상관없다)

말고는 없다.







블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기