일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ftz
- Network
- KASAN
- #Qt Creator
- #Best of the Best #OS #MINT64 #Sqix
- Find
- 오버워치 세이버메트릭스
- C++11
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- libtins
- #IntelManual
- 인터럽트
- vi 외부 명령어
- #
- linux
- #MINT64 #Sqix
- vi
- Overwatch League SaberMetrics
- >
- command
- FTZ 레벨2
- 오버워치
- libpcap
- Sqix
- BEST of the BEST
- vim
- Today
- Total
목록분류 전체보기 (76)
Sqix
군 입대 이후 오버워치 리그 워싱턴 저스티스 쪽에서 코칭 어시스턴트로 일하다 다시 제대로 보안을 잡아보고자 합니다. 그 첫걸음을 Hitcon Training으로 시작하게 되었네요. Sysmagic 풀이 다시 시작해보겠습니다. sysmagic.c 코드와 sysmagic 파일을 제공합니다. c코드를 보면 key와 cipher가 있고, /dev/urandom 함수를 이용해서 난수를 받아온 후 이것과 사용자 입력 패스워드가 일치하면 cipher과 key를 xor하여 flag를 제공해 줍니다. flag를 받기 위해선 urandom에서 주어지는 password를 입력해 분기문 조건을 강제로 맞춰서 바로 cipher과 key가 xor연산을 하여 flag를 뱉어내도록 하면 될 것 같습니다. 그러기 위해선 cmp eax..
https://github.com/scwuaptx/HITCON-Training Hitcon Training Github로 이동해서 git clone https://github.com/scwuaptx/HITCON-Training.git ~/ cd HITCON-Training && chmod u+x ./env_setup.sh && ./env_setup.sh명령어를 입력합니다. apt-get install docker docker.io그 후 docker.sh 실행을 위해 docker를 설치해 줍니다 ./docker.sh마지막으로 docker.sh를 실행해주면 완료됩니다.
FTZ를 전부 클리어했습니다. 이제 LOB / Fedora Castle을 풀고, Pwnable.kr , Pwnable.tw, HITCON Training을 풀며 포스팅하려고 합니다.
RTL 문제가 나왔습니다. 그런데 여기엔 setreuid가 없네요? dummy가 20 bytes이니 총 44bytes(SFP)를 A로 덮고 RET는 system으로 덮고 RET + 4를 다시 A로 덮고(RET 이후 돌아갈 함수의 주소, ebp + 4), RET + 8을 /bin/sh로 넣어 주면(arg00) /bin/sh을 구하는 RTL을 할 수 있습니다.stack 구조 [ buf 20 ] [ dummy 20 ] [ SFP 4 ] [ RET 4 ] [ FUNC ADDR 4 ] [ ARGV00 ] [ ARGV01 ] ... exploit : (python -c 'print "A" * 44 + "\xa4\x7e\x12\x42" + "A" * 4 + "\xc0\xf2\x03\x42"'; cat) | ./att..
소스코드가 꽤 긴데, 여기서는 fd를 이용해서 input을 받아왔습니다. 크게 어려울 건 없네요. fd_set 구조체를 FD_ZERO 매크로로 초기화하고 FD_SET을 이용해서 STDIN_FILENO(0) 소켓번호를 fds에 추가합니다. select 함수를 이용해서 fds를 감시하도록 하였고(FD_SETSIZE, &fds만 argument로 있으므로, io stream 다중화라기보단 fds 감시 목적인 것 같습니다) FD_ISSET(fileno(stdin),&fds)을 통해서 fds가 표준입력으로 정의된 경우에만 read함수를 이용해서 사용자 입력을 받도록 하였습니다. 즉, exploit을 짤 때 C 소스에 대해서 크게 고민할 필요 없이 표준입력을 넣으면 되는 상황입니다. 결국 untrusted inpu..
저번에는 shell 함수가 있었는데 사라졌습니다. 대신 setreuid가 call 호출 이전에 주어졌네요. 그렇다면 RTL 기법을 활용해서 문제를 해결해 보겠습니다. objdump, strings 명령어를 이용해서 system(), /bin/sh의 주소를 구합니다. libASLR이 없으니 저 주소는 고정적입니다. call의 위치에 system() 함수의 주소를 넣어 놓고, fgets에 들어가는 인자를 조작해서 call 직전 stack의 최상단에 /bin/sh 주소를 넣으면 system(/bin/sh) 호출이 됩니다. 이를 위해서는 어셈을 한번 봐야겠죠 gdb 인자로 값을 밀어넣고 실행을 시켜 보도록 하겠습니다. *call이 가리키는 함수를 호출하기 직전에 스택의 맨 위에 buf의 첫 4bytes가 존재하..
프로그램의 구조 상 void (*call)() 함수 포인터가 가리키는 함수의 주소를 shell 함수로 변경하여 shell 함수를 실행시켜야 하는 것 같습니다. 우선 어셈블리를 먼저 확인해보겠습니다. 56바이트의 스택을 확보하고 fgets로 사용자에게서 입력을 받아온 뒤, *call이 가리키는 함수를 실행시킵니다. 여기서 shell 함수의 주소를 찾고, stack에서 *call의 위치(ebp에서의 거리)를 찾아 그 전까지는 덮어버리고 *call을 다른 함수로 바꿔준다면 문제가 해결될 것 같습니다. 여기에서 보면 printit 함수의 주소는 0x8048500, shell함수의 주소는 0x80484d0입니다. 어셈블리를 다시 보면, movl $0x8048500, 0xfffffff0(%ebp)라는 명령어가 있는..
==============================hint #include main(){int crap;int *check;char buf[20];fgets(buf, 45, stdin);if(*check == 0xdeadbeef){ setreuid(3096,3096); system("/bin/sh");}}============================== 이번엔 포인터로 변수가 지정되어 있습니다. 이전처럼 buf랑 dummy를 덮고 이 부분을 0xdeadbeef로 만드는 것은 할 수 없을 것 같습니다. 환경 변수에 0xdeadbeef를 등록하여 이 환경 변수의 주소를 가져오도록 하던지, 아니면 main함수에서 0xdeadbeef가 저장된 주소 혹은 오프셋을 구해서 해당 주소의 값을 참조하도록 하면..
==================================================== hint 레벨 14 이후로는 mainsource 문제를 그대로 가져왔습니다. 버퍼 오버플로우, 포맷스트링을 학습하는 데는 이 문제들이가장 효과가 좋습니다. #include #include main(){int crap;int check;char buf[20];fgets(buf, 45, stdin);if(check == 0xdeadbeef){setreuid(3095,3095);system("/bin/sh");}} ==================================================== 마찬가지로 소스코드를 복사하여 tmp 디렉토리에 붙여넣고 컴파일을 하여 gdb에 올려봤습니다. 0x38, 즉 ..
strcpy를 이용해서 bof시켜 return에 도달할 수 있도록 해서 RTL을 적용해 exploit을 해야 할 것 같습니다. kill 함수는 SIGNAL을 발생시켜 프로세스를 종료시키는 함수입니다. 이 부분을 우회해야 RET로 갈 수 있습니다. 따라서, i 변수의 위치에는 AAAA를 덮지 않고, 정확히 0x1234567을 집어넣어야 합니다. 결국 i의 위치를 계산해야 합니다. main함수를 리버싱해 봅시다 0x080483c8 :push %ebp0x080483c9 :mov %esp,%ebp0x080483cb :sub $0x418,%esp0x080483d1 :and $0xfffffff0,%esp0x080483d4 :mov $0x0,%eax0x080483d9 :sub %eax,%esp 1048만큼 스택 공간..