argv[1] 길이는 48까지.. 딱 ret까지 덮을 수 있넹
buffer, env 지워버리기..
argv도 지워버리기....
내가 기억하기론 0xc0000000에 가장 가까운 곳에 argv가 생기는 걸로 아는데, 여기 말고도 처음 main 함수 들어가기 직전에 파일 이름이 한 번 더 스택에 올라간다고 알고 있다.
정확히 vampire.c의 마지막 부분인 //ultra argv hunter! 이 부분이 어느 부분( or )을 지우는 지 알아봤다.
위와 같은 코드의 test.c를 만들었다.
gcc -o test test.c 로 컴파일하고, gdb test를 통해 값을 확인했다.
이를 통해 문제에서 지우는 argv 값은 main 함수 시작하기 전에 들어가는 파일이름을 지워버린다는 것을 알 수 있다.
그렇다면, 우리는 0xc0000000에 가까운 곳에 적시되는 파일 이름을 이용해 익스할 수 있을 것이다.
내가 처음에 생각한 것은, 심볼릭 링크를 이용해 파일 이름을 "\x90"*0x1000 + "슬래시없는 쉘코드"로 주고, ret을 0xc0000000-0x1000+1 정도로 줘서 쉘 코드를 실행하는 방식이었다.
하지만,,,, 파일 이름과 디렉터리 이름이 너무 길다며 만들어지지 않았다.
어쩔 수 없이! 직접 쉘 코드의 시작 주소를 찾았다.
우선, LOB 환경에서는 스택의 가장 높은 주소가 0xc0000000임을 알고 있다.
cp skeleton tmp
gdb tmp
여기 확인해보면, 맨 밑에 \x00이 5개가 들어가고, 그 다음에 파일 이름이 오는 것을 확인할 수 있다.
내가 파일이름으로 넣을 "슬래시없는 쉘코드"는 35바이트이다.
\x31\xc0\x50\xb8\x2e\x2e\x73\x68\x66\x05\x01\x01\x50\xb8\x2e\x62\x69\x6e\x04\x01\x50\x89\xe3\x31\xc0\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80
[출처 : https://kortsec1n4mationm.tistory.com/18]
그렇다면, 내가 ret 해야하는 주소는 [0xc000 0000 - 0x28] ☞ 0x28 == 40 == 35(쉘코드 길이) + 5(\x00)
정리하면,
1. 심볼릭 링크로 '쉘코드 이름의' 파일 만들기
2. 방금 만든 파일을 실행하며 인자로 아까 구한 값[0xc000 0000 - 0x28] 주기
'워게임 > LOB' 카테고리의 다른 글
LOB - golem(SFP overflow) (0) | 2021.08.04 |
---|---|
LOB - skeleton (0) | 2021.08.03 |
LOB - troll (환경변수) (0) | 2021.08.01 |
LOB - darkelf (0) | 2021.07.31 |
LOB - wolfman (심볼릭 링크) (0) | 2021.07.31 |
댓글