[어설픈] LOB 10번 vampire 문제풀이

2019. 3. 28. 20:59System Hacking/[LOB] Hacker School


안녕하세요!

오늘은 LOB 10번 문제

Vampire 문제풀이를 해보도록 하겠습니다!


문제의  소스코드는 아래와 같이 나와있습니다!

직전 문제와 바뀐 게 몇 개 있네요!


그치만 순서대로 주어진 조건을 살펴볼게요!


1) argument 개수는 2개보다 작으면 안된다!


2) egghunter라는 놈으로 환경변수를 못 쓰게 막는다


3) 입력값의 48번째 값이 \xbf이여야 한다(=스택으로 return 하세요)


4) argument[1]의 길이가 48보다 길면 안돼요!


5) 버퍼는 당연히 초기화 할꺼구요(=못써요 )


6) 이번에는 argv들도 모두 초기화 할꺼에요! (= argv[0] argv[1] argv[2] ... 모든 걸..)


솔직히 조건들을 봤을 땐 좀 절망적이였습니다

아니 argv[ ]들까지 초기화 시키면...

뭐 어디다가 쉘코드 넣으라고....



근데 일단은 메모리 초기화 했다고 해도

실제로 한번 메모리를 끝까지 

까서 봐야겠죠?

무슨 건덕지라도 있을지...


스택상황을 봐야하는데

<main+368>에 breakpoint를 걸고!


(breakpoint를 main 중간에 걸어두고 스택을 확인했던 적이 있었는데,

leave 하기 직전이랑 스택상황이 다른 적이 있었어서

항상 leave직전의 스택을 확인합니다!! )


argument에는 그냥 아무값이나 주고 run 했습니다

어차피 argv[1]이나 buffer 다 초기화 되니까요...



어 근데 ebp 밑에 뭔가 좀 있네요..

이 친구들은 뭐지?


이중에 뭐 건질만한 거 없나?

이왕 이렇게 된거 

스택 끝까지 확인해보죠! 


그렇게 일일이

x/100s (메모리 주소 값)

노가다를 하다가

 

결국 맨 밑에서 월척을 했네요!

바로 이렇게 파일이름이 아래에 저장되어 있었습니다!


argv[ ]들은 모두 초기화 했는데, 

기본적으로 파일이름까지는 건들지 않나 봅니다!

자 그러면  힌트는 뭐다?

뭐는 끝까지 안 바뀐다?


파일이름!!!


파일이름을 바꾸면 되겠죠?

저희가 앞선 문제들에서도 했듯이,

파일이름을 \x90과 쉘코드의 조합으로 넣고!


저희가 넣은 코드가 어디있는지 

그 위치를 찾아서 ret 값에 넣으면 끝나겠네요!


payload  

(파일이름에 \x90 * 50+25byte 쉘코드) + 더미 44개 + 파일이름 위치를 ret addr에 입력


그래서 아래와 같이 gdb에서 

파일 위치를 찾아봤더니!

0xbfffff99에 있네요!



안 보이실까봐 

맨 마지막 부분만 이렇게 가져왔습니다!



그럼 뭐 끝났죠!

파일이름이 0xbfffff99에 저장되어있으니!

ret address에 0xbfffff99를 주면 아래와 같이 payload가 완성됩니다!


그래서 아래와 같이 

1) 파일이름을 0x90*50 + 25byte shellcode로 symbolic link를 만듭니다

2) argv[1]에는 더미 44개와 ret address 0xbfffff99!


그러면 아래와 같이 쉘이 따지고!

비밀번호도 얻을 수 있습니다!

고생하셨습니다!