일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Writeup
- pwnable.tw
- 모듈러 연산
- 호이스팅
- 개인정보보호위원회
- 개인정보보호교육
- 백엔드입문
- arrow function
- 무료교육
- 가명정보처리
- 한국정보보호산업협회기자단
- node.js
- function scope
- 덧셈 암호
- 곱셈 암호
- 디오판투스 알고리즘
- 국가인적자원개발컨소시엄
- package-lock.json
- 개인정보안전성
- 한국산업인력공단
- 웹 프레임워크
- 유클리드_알고리즘
- 확장 유클리드 알고리즘
- package.json
- 한국정보보호산업협회
- 개인정보보호
- 마감임박
- 동적타이핑
- 백엔드
- 포너블
- Today
- Total
목록pwnable (9)
짱짱해커가 되고 싶은 나
파일 분석 start 파일을 실행해보면 다음과 같이 무언가를 입력받고 종료된다. file과 checksec로 봤을 때도 특별히 신경써야 하는 부분은 보이지 않는다. (nc 서버에는 ASLR 걸려있음ㅜ) not stripped이기 때문에 objdump로 어셈블리어를 우선 확인해본다. _start함수와 _exit함수가 있는 것을 확인할 수 있다. 여기서 int 명령어는 처음 보는 명령어였는데 int는 x86 CPU를 위한 어셈브리어로 인터럽트를 발생시킨다고 한다. 예를 들어 int 21h는 0x21(33)의 인터럽트를 생성하는데 이는 인터럽트 테이블의 34번째 벡터를 가리키고 이 함수를 실행시킨다. 여기서 int를 사용하는 부분을 보면 모두 0x80이다. 검색해보니 int 0x80은 시스템 콜을 의미한다고 ..
unsigned int random 에 rand()결과를 대입하고 unsgiend int key에 정수형으로 입력받는다. key ^ random == 0xdeadbeef가 되면 된다. 그런데 radn()함수를 쓰면 결과가 계속 중복되어 나온다. 그러므로 gdb를 이용해서 radn()의 결과를 알아보자. rax에 rand의 결과가 저장되어 있다. 그러므로 key = 0x6b8b4567 ^ 0xdeadbeef 이다.
welcome() 을 통해 name[100]에 100글자 이내로 scanf한다. login()을 통해 scanf("%d", passcode1)를 하고 입력 버퍼를 fflush를 이용해 비운 뒤 scanf("%d", passcode2)를 한다. &passcode1인 passcode1을 하는 것을 확인 할 수있다. 즉, passcode1 변수의 위치 안에 저장하지 못하고 변수의 위치 자체를 바꾸는 것이다. 그렇다면 passcode1에 @got에 system("\bin\cat flag")의 위치를 넣으면 되지 않을까? gdb를 해보자 welcome()함수를 보면 name 배열의 위치가 ebp-0x70인 것을 확인할 수 있다. login()함수를 보면 passcode1의 위치는 ebp-0x10, passcode..
malloc()을 한뒤 그곳에 flag를 복사해 놓았다고 한다. 처음에 loc_44A770을 call하는데 이곳에서 flag를 pop하는 것을 볼 수 있었다. 그런데 analysis failed가 계속 나타났다. 항상 포너블 문제를 풀때 바이너리 파일에 관해 checksec로 보안기법이 걸려있는지 확인하고 시작하자. flag는 UPX로 패킹되어 있다. 패킹 : 실행 파일 압축과 암호화 효과를 위해 사용 + 악성코드를 안티바이러스, 소프트웨어로부터 숨길 수 있고, PE 파일의 내부 코드와 소스 분석을 어렵게 하며 악성코드의 크기를 줄일 수 있다. UPX(the Ultimate Packer for eXecutables) : 여러 OS에서 수많은 파일 포멧을 지원하는 실행 파일 압축 프로그램 - 패킹/언패킹 ..
이번 문제는 앞선 문제와 달리 nc로 접근한다. ssh : 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일 복사 nc : netcat은 TCP/UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를 읽고 쓰는 간단한 유틸리티 프로그램. cat이 파일에 쓰거나 읽듯이 nc는 network connection에 읽거나 쓴다. 즉, ssh는 직접 그 원격 시스템에 로그인해서 시스템 안에 들어가서 명령어를 실행 할 수 있는 것이고 nc는 cat을 이용해서 network connection에 읽거나 쓰는 것이다. 그리고 문제 코드의 주소가 있는데 wget 명령어를 통해 다운받을 수 있다. main함수는 func(0xdeadbeef)를 한다. func()함수를 보면 ov..
col.c 코드를 분석해보면 main의 첫번째 조건문에서 argc는 2이상이어야 한다. 즉, 하나이상의 argv를 입력하면 된다. 기본적으로 argc=1로 path가 들어가기 때문이다. 2번째 조건문에서는 argv[1]의 길이가 20이어야 함을 알 수 있다. 3번째 조건문에서는 argv[1]을 check_password함수에 넣었을 때의 결과가 hashcode와 같으면 flag를 cat할 수 있다. check_password함수를 보면 argv의 배열을 5부분으로 더해서 return하는 것을 확인 할 수 있다. hashcode 를 5로 나누면 113626824*4 + 113626828이 된다. 그런데 총 길이가 20이어야 하므로 hex로 변환하면 0x06c5cecc *1 + 0x06c5cec8 *4 가 ..
코드를 보면 a b c를 할당하고 a free -> b free -> a free 순으로 한다. 그러면 free list에는 a->b->a가 저장되어 있다. d에다가 다시 malloc을 한다. 8byte이기 때문에 fastbin에 있던 a가(예전 a의 주소) 할당된다. 그리고 2번째에 malloc을 다시 하면 b의 주소가 할당된다. 그러면 free list에 남은 주소는 예전 a의 주소만 남아있다. 그런데 다시 a를 할당한다면 d의 주소를 가리키게 되는데 d는 stack이기 때문에 stack영역을 chunk처럼 사용할 수 있게 된다. chunk는 (user data는 최소 16byte + 이전 꺼랑 크기 정보를 포함하고 있어서) + 0x10을 하기 때문에 0x20짜리의 크기를 stack으로 생각한다. a..
fastbin_dup.c를 실행시켜보니 다음과 같이 나왔다. 이 코드는 a, b, c를 할당시킨 다음 a를 free하는데 이렇게 되면 a는 fastbin에 들어가게 된다. 그 다음 바로 a를 할 경우 fastbin의 top인 a와 서로 같아 error가 발생하므로 a가 아닌 b를 free하게 된다. 그러면 sing linked list형태인 fastbin은 b -> a로 바뀌게 된다. 이 다음에 한 번 더 a를 free하게 된다면 fastbin에는 a->b->a로 a가 두 번 들어가게 된다. 3번 free 한 다음에 break point를 걸어줬다. main_arena를 확인해보니 a인 0x602000이 있었다. (그 저 코드를 돌렸을 때는 a : 0x602010 b : 0x602030 c : 0x602..