일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C언어
- hackctf
- 웹페이지 만들기
- c++
- 기계학습
- 숙명여자대학교 정보보안동아리
- lob
- The Loard of BOF
- 드림핵
- 파이썬
- 생활코딩
- BOJ Python
- 머신러닝
- SWEA
- CSS
- XSS Game
- 자료구조 복습
- siss
- 백준
- Python
- BOJ
- HTML
- Sookmyung Information Security Study
- PHP 웹페이지 만들기
- 풀이
- WarGame
- 숙명여자대학교 정보보안 동아리
- hackerrank
- c
- Javascript
- Today
- Total
목록2021 SISS 21기 활동/1학기 시스템 (11)
혜랑's STORY
1. checksec 64 bit 파일이고, NX가 걸려있다. 2. IDA main() 함수 pwn() 함수 IDA에서 함수 목록을 확인해 본 결과 사용되지 않은 함수인 usefulFunction() 함수가 존재한다는 것을 알 수 있었다. 따라서 코드의 흐름을 usefulFunction()이 실행될 수 있도록 변경하면 목록을 확인할 수 있을 것 같다. code from pwn import * context.log_level = 'debug' r = process('./split') e = ELF('./split') usefulFunction = e.symbols['usefulFunction'] print('usefulFunction : ' + str(hex(usefulFunction))) payload ..
1. checksec 32비트 파일이고, NX가 걸려있다. 문제 이름처럼 rop를 사용하여 해결하는 것 같다. 2. IDA main() 함수 vulnerable_function() 함수 즉, vulnerable_function() 함수에서 buf의 크기보다 더 많이 입력을 받아 overflow가 발생한다. 3. Debug [Break Point] 0x084844b : vulnerable_function() 함수 코드 첫 부분 0x0848465 : read() 함수 호출 전 프로그램을 실행할 수 없다고 한다. 따라서 파일의 권한을 변경하고 다시 실행해 보았다. 즉, 문자를 140개 이상 입력하면 Return Address를 덮을 수 있다. [확인해야 할 정보 목록] 쓰기 가능한 영역 read(), writ..
https://github.com/hyerang0125/TIL/tree/master/SISS/System hyerang0125/TIL Contribute to hyerang0125/TIL development by creating an account on GitHub. github.com 깃 허브에서 계속 작성을 할 까 고민을 했지만 캡쳐했던 사진을 이슈에 올렸다가 그걸 다시 옮기는게 너무 귀찮아서 다시 티스토리를 사용하려고 한다.
IDA로 rtl_world 살펴보기 // main() 함수 dlsym() 함수는 c언어에서 사용하는 함수로 두 번째 인자의 주소를 첫 번째 인자(라이브러리)에서 찾아서 변수에 저장한다. 즉, system의 주소는 v6에 "/bin/sh"의 주소는 s1에 저장된다. case 1을 보아 보호기법이 전혀 존재하지 않는 것 같다. case 2는 Get_Money() 함수를 실행시킨다. case 3은 gold를 1999만큼 빼고, system()의 주소를 노출(leak)한다. case 4는 gold를 2999만큼 빼고, shell("/bin/sh")의 주소를 노출(leak)한다. case 5는 buf의 크기보다 더 많이 입력을 받는다.
# checksec을 통해 보호기법 확인하기 -> 확인해본 결과 64bof_basic은 RELRO와 NX가 걸려있다. 따라서 RET 변조를 통해 문제를 해결해야 할 것 같다. #IDA를 사용하여 64bof_basic 살펴보기 s의 크기는 0x110(272)byte 라는 것을 알 수 있다. -> 함수 목록을 살펴보니 "callMeMaybe"라는 함수가 있는 것을 볼 수 있다. callMeMaybe 함수를 살펴보니 쉘을 실행시키는 함수였다. 이 함수의 주소(0x400606)를 전달해주면 쉘을 실행할 수 있을 것 같다. #Payload 앞에서 확인한 내용을 바탕으로 아래와 같이 Exploit code를 작성할 수 있다. from pwn import * p = remote('ctf.j0n9hyun.xyz', 3..
# IDA를 사용하여 bof_basic 살펴보기 s의 크기는 0x34(52) byte 라는 것을 알 수 있다. fgets() 함수의 길이 제한 없이 입력 받는다는 취약점을 이용하여 v5의 값을 "-559038737"로 바꿔주면 shell이 실행되는 것 같다. # buf의 시작 주소 알아내기 fgets()를 호출하고 난 다음에 bp를 걸면 buf의 위치를 알 수 있다. [ebp-0xc](v5)가 0xdeadbeef여야 원하는 값을 볼 수 있다. 실행 해보자. 앞에서 'A'를 넣어주었기 때문에 41이 등장하는 부분이 buf의 시작 주소라는 것을 알 수 있다. v5가 0x04030201가 출력되었고, 'A'를 넣어서 buf의 위치를 확인할 때도 뒤에 0x04030201이 들어있었다. 따라서 버퍼오버플로우를 일..
# checksec을 통해 보호기법 및 파일 유형 체크하기 -> 확인해본 경과 prob1dms 32bit 파일이고, 보호기법은 없다. 따라서 Return Shellcode를 사용해 프로그램의 흐름을 변경할 수 있을 것 같다. # IDA를 통해 Pseudo Code 확인하기 s의 크기는 0x14(20) byte라는 것을 알 수 있다. gets() 함수로 s 변수에 입력받은 문자열을 저장함으로써 버퍼오퍼플로우 취약점이 발생한다. name 주소는 bss영역에 있어 주소가 바뀌지 않는다. (bss영역 : 초기화되지 않은 전역 데이터를 위한 영역) -> 즉, s의 크기가 쉘코드를 전달하기에 충분하지 못하므로 name에 쉘코드를 담고 Return address를 name의 주소를 저장하면 RET 명령어로 해당 주소..
# checksec을 통해 보호기법 및 파일 유형 체크하기 -> 확인해본 결과 pwn3은 32 bit 파일이고, 보호기법은 없다. 따라서 앞서 정리한 Retrun to Shellcode를 사용해 프로그램의 흐름을 변경할 수 있을 것 같다. # IDA를 통해 Pseudo code 확인하기 echo() 함수를 살펴보자. gets(&s) : gets() 함수로 s변수에 입력받은 문자열을 저장한다. -> gets() 함수는 입력받는 문자열의 길이 제한이 없기 때문에 버퍼오버플로우 취약점이 발생한다. -> ebp-EE를 통해 s의 크기가 238 byte 라는 것을 알 수 있다. -> s의 크기가 쉘코드를 전달하기 충분히 크기 때문에 s에 쉘코드를 담고 Return address를 s의 주소를 저장하면 RET 명령..