전체 글

    pwnable.xyz - welcome

    오늘부터 pwnable.xyz도 풀어 볼 것이다. 학교 보안동아리에서 시스템 해킹 분야 멘토링 ?? 에 참가하게 되었다. 📖 1) 문제 파악 먼저 문제를 확인해보자. nc인가 ?? 대충 이렇게 진행이 된다. Leak 부분에는 메모리 주소를 알려주는 것 같다. 이런 상태이다. system 함수가 존재하는 것을 알 수 있다. 📖 2) 문제 분석 _libc_start_main() 함수가 보인다. main 함수로 들어가보자. 우선 이 문제를 풀기 위하여 !*v3 값이 참이어야 한다. 즉 *v3은 false가 나와야 하고 *v3 === 0 이어야 한다. QWORD *v3 코드에 의해 8바이트 크기를 가진 unsigned __int642 가 되었다. 그리고 malloc을 통해서 0x40000 의 크기만큼을 동적할당..

    ProjectH4C 3개월 3주차 과제 (pwnable.kr - flag)

    📖 1) 문제 파악 아마 리버싱 위주가 되는 것 같다. binary만 있으면 된다니 ...... 64비트구나 ...... 우선 좀 사릴 필요가 있겠다. main (start)는 이렇게 생겨있다. 진짜 별 게 안보여서 뒤지던 중 Hex View에서 이걸 보았다. UPX로 패킹이 되어있다. ko.wikipedia.org/wiki/UPX UPX - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. UPX(Ultimate Packer for eXecutables)는 여러 운영체제에서 수많은 파일 포맷을 지원하는 오픈 소스 실행 파일 압축 프로그램이다. GNU 일반 공중 사용 허가서를 통해 공 ko.wikipedia.org 여기서 UPX에 관한 정보를 얻어보자. 결론은 프로그램을 패킹 ( 압축 )..

    ProjectH4C 3개월 3주차 과제 (pwnable.kr - bof)

    📖 1) 문제 파악 무난하게 BOF 슈슉 해주면 풀릴 것 같다. 소스코드를 바로 다운 받을 수 있지만, 공부하는 차원에서 직접 IDA나 GDB로 보도록 하자. main 함수에서는 우선 func(3735928559); 를 실행한다. 이제 func 함수를 알아보자. 여기서 3735928559를 16진수로 바꾸면 0xdeadbeef가 된다. a1에는 0xdeadebeef가 들어가 있는 상황이다. 뭐 그런 상태에서 s배열, v3를 선언한다. 근데 아직 저 __readgsdword(0x14u)의 역할이 무엇인지 모르겠다. 아마도 canary인 것으로 생각된다. 📖 2) 문제 분석 우선 func 함수 내에서 return __readgsdword(0x14u) ^ v3 라는 코드가 있다. v3라는 변수도 마찬가지이고,..

    ProjectH4C 3개월 3주차 과제 (pwnable.kr - fd)

    📖 1) 문제 파악 ssh로 pwnable.kr에 접속해보자. 이렇게 문제파일의 소스코드를 제공해준다. /bin/cat flag 를 실행시켜보도록 하자. 📖 2) 문제 분석 결국 우리가 생각해야 하는 것은, 어떻게 buf에 LETMEWIN\n을 넘겨줄 것이냐 이다. 먼저 한 줄 위를 본다면 read(fd, buf, 32)가 존재한다. read함수의 경우 첫 번째 인자로 int fd;를 받게 된다. fd = 0 : 표준 입력 (STDIN_FILENO) fd = 1 : 표준 출력 (STDOUT_FILENO) fd = 2 : 표준 에러 (STDERR_FILENO) 이다. 즉, buf에 값을 받게 만들 것이라면 fd자리에 0을 넣어주어야 한다. 하지만 그 위에서 fd를 보게 된다면 프로그램을 실행할 때 두 번째..

    C++ 너무 어렵다.

    C++ 너무 어렵다. 백준을 풀면 풀 수록, 구현의 측면에서 C++의 STL이 매우 간편하기에 공부해보고 있다. 우리 학교 알고리즘 동아리 조 톡방에 계신 선배님께 여쭈어봤는데, 그래도 어렵다. string은 구조체인가 클래스인가 ? 바이트는 왜 24바이트인가. 으어ㅓㅓㅓㅓㅓㅓㅓㅓㅓㅓㅓㅓㅓ

    ProjectH4C 3개월 2주차 과제 (UNIT 51, 52, 53)

    📖UNIT 51. 📒 구조체 크기 알아보기 구조체의 크기를 알아보자. 어떻게 계산하면 될까? sizeof 함수를 사용하도록 하자. 우선 가상의 네트워크 헤드를 구조체로 만들었다. #include struct PacketHeader { char flags; // 1바이트 int seq; // 4바이트 }; int main() { struct PacketHeader header; printf("%d\n", sizeof(header.flags)); // 1: char는 1바이트 printf("%d\n", sizeof(header.seq)); // 4: int는 4바이트 printf("%d\n", sizeof(header)); // 8: 구조체 전체 크기는 8바이트 printf("%d\n", sizeof(str..