-
[LOB] Zombie_Assassin -> Succbus Write-up표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 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
인자로 넣어주니 쉘이 따졌다~~
복사본이 아닌 원본에서도 쉘이 잘 따졌다~~
다음 단계로~
반응형'표튜터와 함께하는 Pwnable > The Lord Of the BOF Write-up' 카테고리의 다른 글
[LOB] Nightmare -> Xavius Write-up (0) 2019.03.19 [LOB] Succubus -> Nightmare Write-up (0) 2019.03.19 [LOB] Assassin -> Zombie_Assassin Write-up (0) 2019.03.05 [LOB] Giant -> Assassin Write-up (0) 2019.03.04 [LOB] Bugbear -> Giant Write-up (0) 2019.03.03 댓글