ipwn

[LOB(Lord Of Buffer overflow)] bugbear -> giant 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] bugbear -> giant

ipwn 2018. 1. 19. 16:09

이번 단계는 bugbear단계이다.


바로 /bin/sh의 주소를 가져오는 파일을 만들고 파일들을 읽어보자.


아마 RTL을 주로 하는 단계에서는 copy file이 필요 없을 것 같다.




기본적으로 giant파일과 giant.c 코드가 있다.


코드를 읽어보도록 하겠다.



코드를 보아하니 똑같이 RTL 기법으로 푸는 문제인듯 하다.


일단 가장 먼저 ldd 명령어와 grep 명령어로 libc의 주소를 구한다.


그리고 nm 명령어와 grep 명령어로 libc.so.6에서 execve 함수의 offset을 구한다.


그리고 그 둘을 합친뒤 execve함수의 주소를 구해서 만약 return address가 execve함수가 아닐 경우 


프로그램을 종료시켜버린다. 즉 이 단계는 RTL기법을 execve함수로 진행해서 shell을 가져와야 한다는 말이다.


execve함수는 새로운 파일을 실행시키는 함수인데, 원형은 


int execve (const char *filename, char *const argv[], char *const envp[]);이다.


우리는 execve함수를 바로 종료시키고 system함수를 실행시켜서 /bin/sh를 실행시켜보도록 하겠다.


우리가 넘겨줄 payload는 dummy*44 + &execve + &system + &exit + &"/bin/sh" + &NULL이다.


먼저 execve함수의 주소를 가져오겠다.



execve함수의 주소는 0x400a9d48로 제대로 구해졌다.


이제 나머지 함수의 주소는 그냥 디버깅 해서 구해보자..


모든 주소를 정확히 구해냈다.


0xbffffffc의 위치에는 항상 NULL이 존재한다.


그러므로 &NULL의 값에는 0xbffffffc의 값을 넣어주겠다. 


이제 우리가 넘겨줄 payload는 정확해졌다.


dummy*44 + 0x400a9d48(&execve) + 0x40058ae0(&system) + 0x400391e0(&exit) + 


0x400fbff9(&"/bin/sh") + 0xbffffffc(&NULL)


가 우리가 넘겨줄 payload가 될 것이다.


한 번 giant 파일에 제대로 shell이 가져와지는지 payload를 넘겨줘보겠다.



왜인지 execve함수의 주소가 아니라고 하면서 실행이 되지 않는다.


왜일까?


알고보니 \x0a의 값이 \n 즉 개행을 의미해서 프로그램이 종료 된 것이다.


그렇다면 payload를 더블쿼터(")로 묶어주어서 다시 보내주면 제대로 shell이 가져와질 것이다.


한 번 제대로 가져와지는지 payload를 더블쿼터로 묶어서 넘겨주겠다.



성공적으로 shell을 가져왔다!!!


giant로 가는 password는 one step closer이다.


사실 execve함수로 /bin/sh를 실행시키려 했는데 이상하게 에러도 안뜨는데 shell이 계속 안올라와서


그냥 system함수로 풀어버렸다.

Comments