[FTZ]level17
아침이 밝았습니다.
깔끔하게 정신상태로
memset()하고
시작해볼까요?
보니까 level16과 비슷한 것도 같은데..?
shell함수가 보이지 않네요!!
뭔가 막힌 느낌이네요.
우리가 level11에서는
변수에 shellcode를 삽입하고
그 주소를 리턴주소로 변조했습니다.
스택 내에 변수가 사이즈가 안나오니
우리는 환경변수를 이용해 봅시다.
그럼 환경변수란?
위키백과 왈 " 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임이다."
라고 합니다.
조금 요약해보면
변수는 특정 프로그램에서
데이터를 메모리에 저장해 놓고 쓰지요?
그러나 여러 프로그램이 그 데이터에
쉽게 접근(참조)을 하게 하려면
환경변수를 사용합니다.
헛.. 막상 열어보니
우리가 만든 shellcode는
25바이트고...
buf의 주소는 ebp-56
함수포인터의 주소는 ebp-16
공간이 40바이트나 있네요?
그래도 환경변수를 사용해 봅시다.
payload는...
buf[20] + dummy[20] + call[4]
정도로 구성하면 될 듯 싶네요.
export를 사용해서
SHELLCODE라는 변수를 할당했습니다.
env를 이용해서 잘 들어갔는지도 확인했습니다.
이제
공격코드를 만들러 갑시다.
지금 필요한 것은?
덮어 씌울 환경변수의 주소지요!!
환경변수의 주소는
0xbffffc34입니다.
import os
import struct
p32 = lambda x:struct.pack('<L', x)
call_addr = 0xbffffc34
payload = 'A'*40
payload += p32(call_addr)
print payload
40바이트를 A로 채우고 call부분을
덮어씌웠습니다.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
안됩니다..
환경변수를 너무 하드하게 넣어주어서 그런가..?
그렇다면
조금 유연하게 넣어봅시다.
NOP Sled기법으로
주소가 정확하지 않고 살짝 변화가 있더라도
유연하게 동작할 수 있도록
빨간박스에 있는 것과 같이
'\x90'*100을 추가해주었습니다.
Level18 Password is "why did you do it".
'Wargame > FTZ' 카테고리의 다른 글
[FTZ]level19 (0) | 2019.09.08 |
---|---|
[FTZ]level18 (0) | 2019.09.08 |
[FTZ]level16 (0) | 2019.09.08 |
[FTZ]level15 (0) | 2019.09.08 |
[FTZ]level14 (0) | 2019.09.08 |
댓글