extern?
c언어의 외부 변수
즉, 외부에 있는 변수를 사용하기 위한 키워드
extern char **environ 은 외부에 있는 environ이라는 변수를 가져오겠단 말이군!!
근데 environ이 환경변수를 뜻하는 것 같아서 "c언어 environ"을 찾아봤다.
<프로그램 실행 환경 값을 가지고 있는 광역 변수 environ> - [출처 : https://badayak.com/4378]
extern char **environ; ☞ 외부 참조 변수로 선언 이라고 한다....
그렇다면 저 //egghunter 부분은 환경변수를 모두 호출해 0으로 바꿔버리는 놈이군...
내가 여태 했던 방식이 안 먹히겠다ㅜ
[gdb로 파악할 수 있는 것]
스택 구조를 파악할 수 있다.
------------------------
buffer[40] <- [ebp-40]
------------------------
ebp
------------------------
ret <- [ebp+4]
------------------------
argc <- [ebp+8]
------------------------
argv <- [ebp+12]
------------------------
[첫 번째 풀이]
환경변수는 이용할 수 없지만 argv를 이용하면 된다.
cat /proc/self/maps -> 스택의 가장 아래 주소를 알 수 있다. (또한, ASLR이 걸려있지 않은 것을 파악할 수 있다.)
환경변수가 차지하는 바이트는 그닥 많지 않을 것이다.. 다 복붙해서 len을 보면 대충 알 수 있다.
argv에 "A"*40 + "리턴주소" + "\x90"*0x1000 + "쉘코드" 를 넣고,
"리턴주소"를 0xc0000000 - 0x1000 + 1로 잡으면
"리턴주소"에는 nop가 계속 위치하다가 쉘코드를 발견할 것이다.
즉, 이렇게 익스할 수 있다.
[두 번째 풀이]
cp orc tmp ☞ orc가 goblin 권한으로 복사되어 gdb로 분석할 수 있다. + 이렇게 해야 나중에 core 파일이 생성된다.
core 파일
- 비정상적으로 종료되었을 때 현재 프로그램의 상태를 기록하는 파일
- 디버깅 프로그램(gdb)을 이용해서 어떤 상태였는지 확인 할 수 있다.
[ 출처: https://jh911.tistory.com/entry/linuxCore파일-gdb-bt ]
./tmp `python -c 'print "A"*44+'\xbf"*4'` ☞ segmentation fault 발생, core 파일이 생성된다.
gdb -c core ☞ ret이 0xbfbfbfbf으로 덮이면서 eip=0xbfbfbfbf 이 되면서 jmp eip에서 오류가 발생해서 segmentation fault가 난 것이다.
core 파일을 분석하면 gdb 환경에서의 주소가 아닌, 실제 주소를 파악할 수 있다.
ret이 0xbfbfbfbf로 덮이면서 비정상 종료됐으니까 info reg으로 esp의 주소 = ret 바로 위(높은) 주소라는 것을 알 수 있다.
ret = pop eip; jmp eip인데
jmp eip에서 프로세스가 죽었으므로
esp는 ret(==ebp+4)+4의 주소를 담고 있음을 알 수 있다.
위에 나타낸 스택 구조이므로 buffer의 주소 == (원래)ebp-40 == (방금 구한)esp + 48
즉, 처음에 익스할 때 ret을 buffer의 주소 == esp + 48 == 0xbffffb10 + 0x30 == 0xbffffae0으로 하면 된다.
정리하면, "쉘코드(25bytes)" + "더미 char"*19 + "0xbffffae0" 로 익스할 수 있다.
'워게임 > LOB' 카테고리의 다른 글
LOB - troll (환경변수) (0) | 2021.08.01 |
---|---|
LOB - darkelf (0) | 2021.07.31 |
LOB - wolfman (심볼릭 링크) (0) | 2021.07.31 |
LOB - orc (0) | 2021.07.31 |
[풀이X흐름O]LOB - gate (0) | 2021.07.30 |
댓글