slide-image

 

LOB

[the Lord Of Buffer overflow]

#14 :bugbear->giant

 

 

이번엔 소스코드가 엄청 길어졌다.

지금까지 Load of buffer overflow인줄 알았는데, lord 였다..

일일이 바꾸기 귀찮아서 시간날 때 해야겠다..

음 일단 코드에서 주석부분은 그냥 execve의 주소를 구해와서 ret이 이와 같지 않으면 오류 문구를 내게 하는 장치이다.

 

 

...더보기

일단 execve의 주소를 구해봤다.

 

/bin/sh의 주소는 400fbff9이다.

캡처를 못했는데, 일단 버퍼는 40바이트였고, execve의 인자에 맞게 {"/bin/sh", NULL}과 NULL이 있는 주소를 찾아야 했다. 그냥 환경변수를 이용하기로 했는데, argv[0]이 {"~~", NULL}과 NULL이 있는 형태가 모두 있기 때문이다. 저 노란 부분이 "~~"\n이므로, {"~~", NULL}의 형태가 되기 때문이다. 그리고 그 밑은 NULL의 형태이다.

그럼 argv[0]에 /bin/sh를 올려야 하므로, 심볼릭 링크를 걸어준다. 근데 그 전에 gdb해야 하기 때문에 일단 카피해준다.

파일명을 /bin/sh의 주소로 한다.

 

 

그러고 다시 환경변수쪽을 보니까 제대로 올라가 있다.

 

 

앞의 부분을 빼고 인자로 보내야 하므로, bffffff7이되어야 한다. 그리고 NULL의 주소는 bffffffc이다.

 

이제 심볼링 링크를 걸어서, evecve의 인자 형태에 맞게 RTL 페이로드를 짜준다. 

버퍼+sfp+execve+4바이트+args

args=/bin/sh의주소+{&"/bin/sh", NULL}주소+NULL주소

 

사실 다른 방법도 있는데, 위에처럼 execve의 인자들이 복잡하니까, execve의 인자로 exit을 보내서 종료시키고, system 함수를 불러오는 것이다. system 함수와 execve는 둘 다 바로 위 4바이트가 비어있다.(아무거나 입력해도 됨, AAAA 등) 그걸 끼워넣는 형태로 페이로드를 작성할 수 있다.

따라서 execve system exit /bin/sh의 형태가 되면 되는 것이다.

 

system과 exit의 주소를 구해보았다.

 

페이로드를 작성함. 성공.

함수들의 주소를 정리하자면 이렇다.

 

참고 :

https://grayfieldbox.tistory.com/entry/LOBLord-Of-BufferOverflow-bugbear-giant

https://janghw.tistory.com/entry/Lord-of-BOF-Level-14-bugbear-giant

 

'Wargame > LOB(Redhat)' 카테고리의 다른 글

[LOB] assassin->zombie_assassin  (0) 2019.04.01
[LOB] gaint->assassin  (0) 2019.03.31
[LOB] darkknight->bugbear  (0) 2019.03.28
[LOB] darkelf->orge  (0) 2019.03.28
[LOB] wolfman->darkelf  (0) 2019.03.28