gadget diversity
문제를 풀면서 정말 다양한 가젯을 봐왔다. 그중 정말 아름다운 가젯을 설명하려 한다.
rsp corruption
rsp + 0x38; ret;
첫번째는 rsp를 조작하는 가젯이다. 이건 정말 고급 공격에 가능한데 일단 rsp를 조작할 수 있으면 추후 생기는 함수에 대해서 스택 위치가 조작가능해진다. 또한 추가적으로 함수내에 local 변수들에 대한 일단적인 쓰기 행동이 RA overwrite가 될 수 있게 된다. 즉 정말 고급진 공격으로 이어질 수 있다는 뜻
C
0x000000000008f0c0 : add rsp, 0x10 ; pop rbx ; pop r12 ; pop rbp ; jmp 0x95280
0x0000000000044d21 : add rsp, 0x10 ; pop rbx ; pop r12 ; pop rbp ; ret
0x00000000000586d0 : add rsp, 0x10 ; pop rbx ; ret
0x000000000002a0a8 : add rsp, 0x18 ; pop rbx ; pop rbp ; jmp 0x1298f0
0x000000000010ecaf : add rsp, 0x18 ; ret
0x00000000000f5700 : add rsp, 0x20 ; mov r15d, eax ; jmp 0xf5448
0x0000000000184814 : add rsp, 0x20 ; pop rbx ; pop r12 ; pop rbp ; jmp rax
0x000000000005e8d1 : add rsp, 0x20 ; pop rbx ; pop r12 ; pop rbp ; ret
0x000000000014a6e3 : add rsp, 0x30 ; jmp 0x14a057
0x0000000000069235 : add rsp, 0x30 ; jmp 0x691a0
0x0000000000076de8 : add rsp, 0x30 ; jmp 0x76d48
0x00000000001afa26 : add rsp, 0x30 ; mov rax, rbx ; pop rbx ; ret
0x00000000000982f6 : add rsp, 0x30 ; pop rbx ; pop r12 ; pop rbp ; jmp rax
0x000000000002a76d : add rsp, 0x30 ; pop rbx ; pop r12 ; pop rbp ; ret
0x00000000001af583 : add rsp, 0x38 ; or rax, 1 ; ret
0x000000000012df8a : add rsp, 0x38 ; ret
0x00000000000481e6 : add rsp, 0x40 ; jmp 0x48096
0x000000000012dfeb : add rsp, 0x40 ; ret
0x00000000001435a9 : add rsp, 0x50 ; pop rbx ; pop r12 ; pop rbp ; ret
0x0000000000184659 : add rsp, 0x60 ; pop rbx ; pop r12 ; pop rbp ; jmp rax
0x00000000000ee303 : add rsp, 0x60 ; pop rbx ; pop r12 ; pop rbp ; ret
0x0000000000125ff9 : add rsp, 0x60 ; pop rbx ; pop r14 ; pop rbp ; ret
0x0000000000058765 : add rsp, 8 ; movzx eax, al ; ret
0x0000000000114d36 : add rsp, 8 ; pop rbx ; pop rbp ; retlimited space ROP
pop_rax__pop_rdi__call_rax, system, /bin/sh
ROP를 할 수 있는 공간이 충분하지 않다면, 스택정렬도 맞춰야 하고 system , binsh 도 맞추어야 한다. 물론 one_gadget이 가능하면 사용하겠지만, 조건을 맞추기도 쉽지 않다.
이럴때 다음과 같은 가젯을 사용하면 단, 24 바이트로 ROP가 가능하게 된다.
C
(pwnenv) root@ee192b14fcee:/home/pwn# ROPgadget --binary ./libc.so.6 | grep ": pop rax ; pop rdi ;"
0x0000000000129a30 : pop rax ; pop rdi ; call rax