일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 해킹
- SQL Injection
- Samba
- Hacking
- 메타스플로잇
- root권한
- Los
- SQLINJECTION
- 취약점 스캔
- web hacking
- Kioptrix
- 스캔
- 칼리리눅스
- 암호해독
- 침투테스트
- 모의해킹
- smb
- 취약점분석
- Metasploit
- 시스템 해킹
- load of sqlinjection
- 포트스캔
- 취약점
- 스캐닝
- 권한상승
- 해킹툴
- sql
- 해킹도구
- CTF
- 내부침투
- Today
- Total
감자 텃밭
g++ pwn 본문
이번에 풀 문제는 g++ pwn이라는 문제로 c++로 작성되어있는 프로그램이다
일단 먼저 해당 프로그램을 실행시켜 보았다.
특정 문자열을 입력받을 수 있고 입력한 문자열을 출력해주는 거 같다.
그 후
해당 프로그램에 적용되어있는 메모리 보호기법을 확인해보았다.
NX가 걸려있는걸로 보아 쉘 코드는 실행이 불가능할 것이다.
IDA를 통해 상세히 분석해보자
main함수에서는 별다른건 없고 vuln함수를 호출한다
vuln함수를 살펴보자
음...보자말자 멘붕이 왔다.. 일단 차근차근 살펴보면 fgets를 통해 s변수에 32바이트만큼 입력받으며, input변수에 입력받은 s의 값을 대입한다. 그 후
v5 변수에 you 문자열을, v7 변수에 I문자열을 넣고 replace 함수를 이용하여 I문자를 you문자열로 변경시켜주는 듯 하다..(자세한건 더 찾아봐야 할 거 같다)
그 후 아래의 내용을 거쳐 v0변수에 input변수의 값을 넣은 후 strcpy를 통해 출력한다 이부분에서 bof를 일으키는 것 같다. fgets에서는 32바이트로 입력값 검증이 이루어지므로 bof를 바로 일으킬 수 없다. s변수부터 ret까지의 거리는 총 64바이트이다. 그렇다면 문자열이 변경되는 부분을 생각해보면 된다.
I가 you로 변경되므로 I는 3바이트의 크기로변경된다는 것이다. 그럼 I를 21개(63바이트)를 넣고 1바이트의 더미를 씌운 후 RET까지 접근이 가능하다. 그렇다면 RET에는 무엇을 넣어야 할까
해당 프로그램에 get_flag라는 함수가 존재하며 해당 함수는 flag를 알려준다. 그렇다면 ret부분에 해당 get_flag 함수의 주소를 입력하면 될 것이다.
get_flag함수의 주소는 0x08048f0d 이다 이제 구해야 할 것은 모두 구했으므로 공격코드를 작성하자
I를 21개를 입력하여 63바이트를 채우고 1개의 더미값을 채워 RET까지 접근하여 RET부분에 flag_get함수의 주소를 넣어
flag가 나타나도록 작성하였다 실행시켜보면 정상적으로 공격에 성공하여 flag를 획득할 수 있었다,
'my_study > HackCTF' 카테고리의 다른 글
[HackCTF] 1996 (0) | 2021.08.09 |
---|---|
[HackCTF] Poet (0) | 2021.08.09 |
bof_pie (0) | 2021.07.22 |
basic_fsb (0) | 2021.07.21 |
rtl_core (0) | 2021.07.21 |