일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 웹보안
- 보안
- webhacking.kr
- hackctf
- spring Batch
- 웹해킹
- 백준
- Python
- 스프링 배치
- gcp ci/cd
- 포너블
- 회고
- docker
- pwnable.xyz
- sequelize
- 시스템 해킹
- cloud run
- programmers
- gcp
- 사이버보안
- kotest
- Batch
- 네트워크
- node.js
- Baekjoon
- 파이썬
- 프로그래머스
- 리버싱
- gcp cloud build
- nodejs
목록pwnable (2)
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..