pwn college의 rop 문제들을 풀면서 배운 점들을 적어본다.
pwn college의 libc 버전인 2.31으로 봤는데 다른 버전일 땐 해당 libc 파일을 gdb로 보면 되겠다.
1. 리턴 주소가 __libc_start_main인데 leak이 전혀 안된 상태에서 main으로 리턴이 필요한 경우
- glibc 2.31에서 main 함수의 리턴 주소는 <__libc_start_main+243>이다.
- 여기서 최하위 바이트를 변조시켜 <__libc_start_main+208>으로 변조시킨다면 다시 main으로 갈 수 있다.
0x24060 <__libc_start_main+208>: mov QWORD PTR fs:0x300,rax
0x24069 <__libc_start_main+217>: mov rax,QWORD PTR [rip+0x1c7e40] # 0x1ebeb0
0x24070 <__libc_start_main+224>: mov rsi,QWORD PTR [rsp+0x8]
0x24075 <__libc_start_main+229>: mov edi,DWORD PTR [rsp+0x14]
0x24079 <__libc_start_main+233>: mov rdx,QWORD PTR [rax]
0x2407c <__libc_start_main+236>: mov rax,QWORD PTR [rsp+0x18]
0x24081 <__libc_start_main+241>: call rax
0x24083 <__libc_start_main+243>: mov edi,eax
0x24085 <__libc_start_main+245>: call 0x46a40 <exit>
2. 원 가젯에서 인자로 "/bin/sh"을 쓰지 않고 싶을 경우
- 원가젯은 "/bin/sh"을 인자로 가지고 execve 시스템 콜을 수행한다.
- execvpe 함수를 보면 아래와 같이 "/bin/sh"가 아닌 다른 값을 가지고 execve 시스템 콜을 호출 할 수 있는 부분이 존재한다.
- rdi가 가리키는 주소에 저장된 값과 동일한 값을 이름으로 가진 바이너리를 만들어 원하는 동작을 수행할 수 있다.
- 리눅스에서 파일 이름을 ''$'\001' 같은 8진수 형태로 만들 수 있다.
0x00000000000e38c5 <+69>: mov rdx,r12
0x00000000000e38c8 <+72>: mov rsi,rbx
0x00000000000e38cb <+75>: mov rdi,r13
0x00000000000e38ce <+78>: call 0xe3170 <execve>
'background > linux' 카테고리의 다른 글
[pwn.college] Format String Bug (0) | 2024.05.06 |
---|---|
FSOP(File Stream Oriented Programming) (0) | 2024.04.29 |
[how2heap] Tcache Poisoning (glibc 2.31/2.35) (0) | 2024.04.10 |
[how2heap] House of Botcake (glibc 2.31) (0) | 2024.03.18 |
[how2heap] Fastbin dup into stack (glibc 2.35) (1) | 2024.03.11 |