일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- node.js
- hackctf
- 네트워크
- 회고
- webhacking.kr
- gcp
- gcp ci/cd
- 보안
- Batch
- 시스템 해킹
- 프로그래머스
- 파이썬
- pwnable.xyz
- 사이버보안
- Python
- kotest
- 웹해킹
- spring Batch
- 스프링 배치
- 백준
- cloud run
- programmers
- docker
- 리버싱
- sequelize
- gcp cloud build
- nodejs
- 포너블
- Baekjoon
- 웹보안
목록Security (17)
uju's Tech
파일 확인 해보니 elf 64 비트 실행 파일 임을 알았다. chmod 777 권한을 부여하여 실행해보자! 실행 실행해보니 input을 받고 그에따라 값을 내보내는것 같다. 그렇다면 조건문에서 내 input과 어떠한 값을 확인하고 분기하여 값을 출력함을 알 수 있다. 먼저 디버깅을 해보자~! main 디버깅 strcmp비교해서 분기 strcmp에서 비교 후 분기하는것을 확인할 수 있다. 브레이크 포인트를 main+185에 걸어주자1 r 으로 실행! 실행화면 내가 입력한 dddddd와 비교하는 값을 레지스터를 통해 확인하였다. 레지스터 확인 얼핏 보니 OfdlDSA|3tXb32~X3tX@sX`4tXtz 랑 비교를 해서 같으면 good game을 출력해준다. goodgame! 그렇다면 여기서 우리는 비교하는..
https://uju-tech.tistory.com/25 위 링크에 대한 쉽게 푸는 풀이이다.. 정공법(???) 으로 푼 풀이..?이고 이번에는 약간 쉽게가자!풀이입니다! main함수 main함수를 확인해보면 이 부분에서 1이어서 0과 비교했을 때 같지 않아서 flag를 뛰어넘었습니다!! 라는 문구가 띄워진다.. 그렇다면 저 1을 0으로 바꾸면?? 바로 flag가 출력될것이다!! 그럼 ida에서 바꿔서 flag를 바로 띄워보잣!! ida에서 값을 바꾸고 fetch한다음 실행할 것이다. 바꿀 값에서 오른쪽 마우스를 눌러 synchronise with hex view를 누르자. hexview클릭! 그리고 hexview로 이동! 이동하면 해당 변수의 부분이 초록색으로 나타내준다. 수정 후 모습 수정을 하려면 ..
먼저 실행 파일을 다운 받자..! 우분투에서 먼저 파일 포맷을 확인해보자! 파일 확인 elf 64bit 실행파일임을 확인했다. 실행을 위해 777권한 부여!! 이제 실행해 보자 실행! 근데 ... flag를 뛰어넘었습니다 라는 문구가 나오면서 끝난다.. 그렇다면 ida로 파일을 살펴보자..!! ida 음 flag is %s 를 보면 string값을 가져와서 출력하는 것을 알 수있다. 그 string을 받아오는 곳이 loc_400544이다. 이 부분을 중심으로 살펴보자..! 함수를 보면 string과 array라는 2개의 배열이 있고 2개의 배열에 값을 더해준다,,string과 arryay를 더블 클릭해보니 data영역 뿅 하고 데이터 저장되어 있는 부분이 나온다,, 위의 사진은 array! 위의 사진은 ..
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로 만들어 주어야..