표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up

[LOB] Zombie_Assassin -> Succbus Write-up

IMyoungho 2019. 3. 14. 02:17

혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다.



이번 문제는 생각보다 너무 쉬웠당~

우선 코드를 보자~



< Main >

Main 함수를 보게되면 우선적으로 공유라이브러리를 사용할 수 없도록

'\x40'을 검사하는 제약을 걸어두었고 addr가 DO 함수의 주소가 아닌 경우에

이 또한 프로그램을 더 이상 진행하지 못하도록 하였다.

또한 ret부분을 제외한 나머지 버퍼들을 초기화 시켰다.


ret값에 DO함수의 주소값과 비교해서 다르면 더 이상진행할 수가 없었으므로

덮어쓸 ret에 넣어줄 DO함수의 주소값을 가진 녀석이 필요하다는 것을 알 수 있었다.


<함수 MO, YOT, GUL, GYE, DO>

함수들의 정의를 보니 전역변수 check값으로 조건문을 통과할 수 있음을 알 수 있었다.

연쇄작용처럼 DO, GYE, GUL, YUT, MO 함수가 진행되어야하며

마지막에 MO함수에 있는 system함수를 이용하는 문제라는 것을 알 수 있었다.

그러므로 DO함수뿐만아니라 모든함수의 주소를 구해야했다.



함수의 주소를 구하는 방법은 여러가지가 있다.

objdump나 gdb의 print, readelf, 그리고 어셈블리어 코드를 보고 직접찾기 중 원하는걸 사용하자



< objdump 사용 >

,



< gdb의 print >



< readelf 사용 >



< 어셈블리어 코드 보고 찾기 >

memcmp 전에 넘겨지는 인자들을 보고 addr을 유추


MO함수의 주소임을 확인



주변을 뒤져보니 함수들이 존재함


깔끔하게 찾았지만 그냥 이전의 방법들을 사용하자^^



이렇게 우리가 필요한 함수들의 주소를 모두 찾았다.


그렇다면 이제 Payload를 구성해보자

Payload = "a"*44 + &DO + &GYE + &GUL + &YUT + &MO + dummy(4) + &"/bin/sh"+"/bin/sh"

이런식으로 RTL의 개념으로 함수들을 실행시켜야한다. 그렇게되면

함수의 실행에 따라 check 값들이 조건문을 통과하면서 결국엔

MO함수의 System함수가 작동될 것이다. 이제 남은 것은 "/bin/sh"를

System함수의 인자로 넘겨주는 것이다. 우선 Payload를 진행해보았다.

dummy 와 "/bin/sh"의 주소는 각각 "bbbb" 와 "cccc"로 주었다.



역시 Segmentation fault가 일어났다. core파일을 확인해보자



오잉? 인자로 입력한 "/bin/sh"이 보인다. 초기화되지 않은 부분이 있다는 것을 확인할 수 있었다.



초기화되지 않은 이유는 바로 제일 위의 Succubus.c 코드를 보면 알 수 있다.

memset에서 ret 이후부터 100byte는 초기화하는 영역에 들어가지 않았기 때문이다.

그렇기 때문에 우리는 이 영역을 사용해서 공격을 할 수 있는 것이다.




정확히 "/bin/sh"의 주소를 확인하였다.

"/bin/sh" 의 주소 = 0xbffffa98



인자로 넣어주니 쉘이 따졌다~~



복사본이 아닌 원본에서도 쉘이 잘 따졌다~~


다음 단계로~


반응형