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