일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- cloud run
- gcp
- hackctf
- 시스템 해킹
- nodejs
- Python
- gcp ci/cd
- spring Batch
- docker
- 포너블
- Baekjoon
- 회고
- 파이썬
- 리버싱
- 프로그래머스
- 보안
- programmers
- sequelize
- kotest
- 네트워크
- node.js
- gcp cloud build
- 스프링 배치
- 웹보안
- Batch
- pwnable.xyz
- 백준
- webhacking.kr
- 웹해킹
- 사이버보안
목록시스템 해킹 (6)
uju's Tech
ida로 main함수를 띄워보았다. vtable의 주소에서 v3만큼 더해준 주소를 호출한다는 것인데 flag를 보여주는 함수를 가져와주면 될 것 같다. 메뉴에서 1.malloc을 들어가면 size를 입력받는데 이 size에 flag를 보여주는 함수 주소를 입력해주자. 그리고 vtable에서 -2를 하게되면 size를 가리키게 된다는 점을 ida를 통해서 확인했다. (0x6020c0-0x6020b0=16/8=2byte) flag를 보여주는 함수를 찾아보자. flag가 있는 함수의 주소는 0x400a31이다. 0x400a31을 10진수로 나타내면 4196913이다. size에 4196913을 입력해주고 메뉴2번인 free로 들어가서 size를 가리키게 만들어주자. 그럼 문제를 풀어보자! 끝!
위에서 memset함수는 어떤 메모리의 시작점 부터 연속된 범위를 어떤 값으로 모두 지정하고 싶을 때 사용하는 함수이다. 따라서 1바이트마다 0으로 초기화하고 98바이트를 반환한다는 뜻이다. V5+7을 0xdeadbeef--->0xb000000b5 로 바꾸어주면 win함수 실행 7바이트를 더했고 리틀엔디안 방식으로 저장되었으므로 스택에 저장되는 구조를 생각해보면 이런식으로 쌓이는 것을 알 수 있다. 먼저 위에 진한 초록색 부분인 0xb500000000000000의 msb가 1이여서 음수라는 것을 알수있다. 이 경우 10진수는 0xb500000000000000의 보수+lsb에 1을 더해준 값이다. 보수표현으로 바꾸어주면 위의 사진과 같이 표현할 수 있다. 위의 사진에서 lsb에 1을 더해주면 0x4b000..
"Menu:\n 1. Change name.\n 2. Change nationality.\n 3. Change age.\n 4. Get shell. 스택 카나리로 인해서 ret함수를 덮지 못한다. 2.nationality에서 받는 v7을 오버플로우시켜 v8을 덮도록하자 V7=0x40 V8=0x10 0x40-0x10=16(dec) 16bytes를 dummy 값으로 채우고 v8에 got의 strncmp함수의 주소를 적어준다. Win함수=0x40099c=4196764 D =0x401d6e Got함수=0x603018 익스플로잇을 짜보자! 끝! 역연산으로도 풀수 있다고 하는데 잘 모르겠다 ㅋㅋㅋㅋㅋ.....ㅜㅜ
Ida를 사용해서 main함수를 살펴보자. 위에서 memset함수는 어떤 메모리의 시작점 부터 연속된 범위를 어떤 값으로 모두 지정하고 싶을 때 사용하는 함수이다. 따라서 1바이트마다 0으로 초기화하고 50바이트를 반환한다는 뜻이다. Ret 주소=0x7fffffffdfd0+8=0x7fffffffdfd8 Ret주소 위로 rbp 위로 v8,v7,v6,v5,v4, V6=0x68 V7=0x60 V8=0x8 0x60-0x8=88 88/8=11-->11*8바이트 V7[v6]=v4+v5 여기서 취약점이 발생한다, V6를 조절하여 ret값으로 만들고 v4+v5를 win함수 주소 값으로 만들어준다. 그러면 win함수로 리턴이 된다. 스택을 생각해보면 ret은 v7위치인 rbp- 0x60에서 rbp+0x8로 만들어 주어야..
Win 함수 주소 Got함수 0000000000601220 601480 Read 함수 601248 Edit note함수에서 입력받을 길이 정하고 문자열 입력 입력받을 길이에 제한을 두지 않는다. 문자열을 입력할 때는 전역변수 buf에 입력한다. 입력받은 buf는 전변수 s에 복사 Edit desc에서는 buf에 20만큼 입력받는다. exploit을 짜준다.!! 실행! 끝!
문제 풀이를 시작하기에 앞서서 기본적인 환경을 만들어 주겠다. 문제풀이를 위해 서버로 접속할 수 있는 netcat을 다운받아준다. Sudo apt-get install netcat Sub의 바이너리 파일을 ida로 열어보면 아래와 같은 main함수가 나타난다. v4-v5=4919 를 만들어주면된다. Pwntools를 이용해 풀어주겠다. 실행! 플래그가 나온다! Sub 들어가서 플래그 치는 곳에 FLAG{sub_neg_==_add}를 쳐주고 submit눌러주면 끝!