일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Aleph One
- picoCTF
- #picoCTF2018
- Protostar
- Smashing The Stack For Fun And Profit
- Hxd
- general skills
- dreamhack
- grep
- picoCTF2018
- 리눅스
- WEB
- 시스템
- 시스템해킹
- 리버싱
- write up
- writeup
- 번역
- 해킹 공부
- #hacking
- forensics
- cryptography
- 해설
- 스택
- 버퍼오버플로우
- 카이사르
- 정답
- reversing
- KOISTUDY
- CTF
- Today
- Total
목록Protostar (6)
Security || AI
gets에서 esp+0x10을 호출하는 것을 볼 수 있다. 이는, 0x10이 문자열을 입력받을 변수 인것으로 보인다. 또한, esp에서 0x50을 뺀 것을 보아, 문자열을 입력받는 변수의 크기는 0x50-0x10으로 64로 파악된다. 쉘을 얻어내려면 ret 다음에 쉘코드를 삽입하여 쉘을 따내야할것 같으므로 브레이크포인트를 main+22(ret)에 걸어준다. peda를 사용해서 100개 정도의 패턴을 생성한 후, stack영역을 보면 AA4A를 볼 수 있고, 이는 offset이 76이다. 위 사진처럼 msfvenom을 사용하여 x86환경에서의 /bin/sh 명령을 실행하는 쉘코드를 만든다. 현재 buffer의 크기는 64이므로 쉘코드를 올리고 ret에 buffer의 시작주소로 덮으면 쉘 코드를 실행시킬 수..
문제 탐색 ghidra로 디컴파일을 해본 결과 stack3문제와 같이 win함수가 존재했다. 그러므로, 해당 문제에서는 return을 win함수로 덮어쓰면 문제가 풀릴 것이다. 문제 풀이 gdb로 main함수의 RET에 브레이크 포인트를 걸고, RET까지의 메모리 거리를 구할 것이다. 먼저, ghidra를 통해 RET까지의 거리가 76인 것을 구하였다. 또한, win함수의 시작 주소는 0x080483f4를 구하였다. 그러므로 A76개와 win함수를 합쳐 페이로드를 작성하였다. from pwn import * p = process('./stack4') win_addr = p32(0x080483f4) payload = 'A'*76+win_addr p.sendline(payload) print(p.recvre..
ghidra를 사용하여 디컴파일을 해본 결과 local_14에 함수의 포인터를 저장하고, 해당 함수를 호출하는 구조이다. gdb를 사용하여 info functions를 한 결과 win이라는 함수를 찾을 수 있었고, puts("code flow successfully changed");를 실행하는 것을 보아 해당 함수로 넘어가게 해야 할 것이다. 이때, local_54의 메모리가 총 64만큼 할당되어 있으므로 페이로드를 64개 + win함수의 주소를 해야한다. 위의 사진을 통해 win함수의 주소는 0x08048424인 것을 확인 가능하다. 위의 정보들을 바탕으로 pwntool로 익스플로잇 코드를 짜면 다음과 같다. from pwn import * p = process('./stack3') win_addr ..
먼저, stack2를 실행하면 아래와 같은 뜻이 나온다. stack2: please set the GREENIE environment variable 이를 통해 환경변수를 사용하여 익스플로잇을 해야한다는 힌트를 얻을 수 있다. 여기서 main+91에 하당하는 0x8048618의 문자열을 확인하면 답이 풀린다는 문자열을 확인할 수 있다. 그러므로, main+84의 cmp가 참일 경우에 문제를 풀 수 있어, main+84에 브레이크포인트를 걸어보았다. 다음으로 여기서 값이 입력되는 것은 GREENIE라는 환경변수에 적용되므로 환경 변수를 지정해주어야 한다. 이때, [esp+0x58]의 값을 0xd0a0d0a로 바꾸어야하므로 해당 주소 전까지의 거리를 재기 쉽게 pattern create를 사용하여 문자열을 ..
gdb를 사용하여 디스어셈블리를 진행한 결과 위와 같이 나온다. 해당 문제는 argument를 사용하여 값을 입력 받는다. ex) ./stack1 AAAA 그러므로 argument의 주소를 확인해보면 main+71에서 eax와 ABCD를 검증하는 것을 확인할 수 있는데, 이때, eax는 esp+0x5c이 되므로 esp+0x5c의 값을 abcd로 바꾸어야 한다. 참고로 현재 esp+0x5c에는 를 통해 0이 들어있는 것을 확인할 수 있다. 해당 함수를 보면 argv[1]의 주소인 esp+0xc를 strcpy에 저장될 변수인 0x1c에 주소를 저장하게 된다. 그러므로, 0x5c-0x1c = 0x40이 되며, 64byte만큼 버퍼를 채운 후, 뒤를 abcd로 채우면 된다. buffer (64byte) 0x61..
buffer의 크기를 구하기위해 modified != 0 에 해당하는 test eax, eax라는 명령어의 브레이크 포인트를 걸어 메모리의 거리를 구한다. 사진을 보면 EAX에 AAdA가 들어간 것이 보인다. 이것이 브레이크 포인트가 걸리기 전까지의 레지스터 상황이므로 문자열에서 AAdA의 위치를 확인하면 64번째로 나온다. 그러므로 buffer의 크기인 64만큼 채워주고 modified도 채우기 위해 64에 int형이므로 4바이트를 차지하므로 4개더 추가한 68개를 추가한다.