일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 정답
- general skills
- 시스템해킹
- 해설
- picoCTF
- Hxd
- reversing
- 카이사르
- KOISTUDY
- 스택
- Protostar
- write up
- 리눅스
- 시스템
- writeup
- #picoCTF2018
- forensics
- 리버싱
- 해킹 공부
- CTF
- #hacking
- picoCTF2018
- dreamhack
- cryptography
- WEB
- Aleph One
- Smashing The Stack For Fun And Profit
- 번역
- grep
- 버퍼오버플로우
- Today
- Total
목록버퍼오버플로우 (9)
Security || AI
문제 탐색 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 ..
buffer의 크기를 구하기위해 modified != 0 에 해당하는 test eax, eax라는 명령어의 브레이크 포인트를 걸어 메모리의 거리를 구한다. 사진을 보면 EAX에 AAdA가 들어간 것이 보인다. 이것이 브레이크 포인트가 걸리기 전까지의 레지스터 상황이므로 문자열에서 AAdA의 위치를 확인하면 64번째로 나온다. 그러므로 buffer의 크기인 64만큼 채워주고 modified도 채우기 위해 64에 int형이므로 4바이트를 차지하므로 4개더 추가한 68개를 추가한다.
번역한 내용들이 있는 PDF입니다.
Small Buffer Overflows작은 버퍼오버플로우~~~~~~~~~~~~~~~~~~ 버퍼오버플로우하려는 버퍼가 너무 작아 쉘코드를 넣기에도 맞지 않는 경우가 생길 것이고, 우리의 코드의 주소를 덮어쓰는 것이 아닌 명령들로 반환 주소들을 덮어쓸 수 있거나, 문자열 앞에 채우는NOP들의 수가 너무 적어 그들의 주소를 맞추기 어려울 때가 있다. 이런 프로그램들로부터 쉘을 얻으려면 다른 방법을 사용해야 한다. 이 특별한 접근은 프로그램의 환경 변수에 접근할 때만 작동할 수 있다. 우리가 할 것은 우리의 쉘코드를 환경 변수에 위치시키고, 버퍼를 메모리에 있는 변수의 주소로 오버플로우하는 것이다. 이 방법은 쉘 코드를 포함하는 환경 변수를 원하는 크기로 만들 수 있으므로 익스플로잇 방법의 변경도 증가시키다...
Writing an Exploit익스플로잇 짜기~~~~~~~~~~~~~~~~~(or how to mung the stack)(또는 어떻게 스택을 망가뜨리는가)~~~~~~~~~~~~~~~~~~~~~~~~~` 이제 모든 조각들을 조합해 보자. 우리는 쉘코드를 가지고 있다. 우리는 이것이 버퍼오버플로우에 사용할 문자열의 부분이 되어야 한다는 것을 알고있다. 우리는 버퍼에 복귀 주소를 다시 지정해야한다는 것을 알고 있다. 이 예제는 이러한 점들을 증명할 것이다: overflow1.c------------------------------------------------------------------------------char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0..