일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- BEST of the BEST
- >
- #IntelManual
- linux
- vi 외부 명령어
- vim
- KASAN
- #Best of the Best #OS #MINT64 #Sqix
- Sqix
- Find
- libpcap
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- Network
- command
- #MINT64 #Sqix
- ftz
- C++11
- 인터럽트
- Overwatch League SaberMetrics
- vi
- FTZ 레벨2
- #
- 오버워치 세이버메트릭스
- libtins
- 오버워치
- #Qt Creator
- Today
- Total
목록전체 글 (76)
Sqix
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가 존재하..