전체 글 (62) 썸네일형 리스트형 [ProjectH4C] HackCTF (x64 Buffer Overflow) 64비트의 버퍼 오버플로우도 32비트와 다를 것 없다. ebp, esp, eax대신 확장된 레지스터인 rbp, rsp, rax를 사용하며, 주소가 4바이트인 32비트와는 달리 주소의 길이가 8바이트이다. 먼저 IDA를 이용해 코드를 확인해준다. s 변수에 문자열을 입력받고, v5에는 길이를 저장한 후, s를 출력해주는 함수이다. 왼쪽에 함수들 목록을 보면 callMeMaybe 라는 함수가 있다. 쉘을 실행시켜주는 함수이다. main 함수의 ret에 callmeMaybe 함수의 주소를 덮어씌우면 된다. IDA 상에서 s의 위치는 rbp-0x110이라고 나와있다. 페이로드는 다음과 같다. A*0x110 + ebp [8Byte] + callmeMaybe [8Byte] 코드는 다음과 같다. from pwn im.. [ProjectH4C] HackCTF (내 버퍼가 흘러넘친다!!!) prob1 파일의 코드는 다음과 같다. 쉘 코드를 s에 저장하는 방식은 어떨까 했지만, s가 0x14바이트밖에 안되기 때문에 name의 주소를 알아 낸 후에 name에 쉘 코드를 넣어두고, s를 이용해 버퍼 오버플로우를 일으켜 ret 주소에 name의 시작 주소를 덮는 방식을 선택했다. 먼저 gdb를 통해 알아낸 name의 주소는 다음과 같다. name은 2번째 인자이기 때문에 0x804a060이 name의 주소가 된다. 카나리, NX-bit 등의 보호기법도 적용되어 있지 않기 때문에, buf 크기 20바이트 + sfp 4바이트 이후에 name의 주소를 덮으면 될 듯 하다. 페이로드는 다음과 같다. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3003) shel.. [ProjectH4C] HackCTF (Basic_FSB) 포맷 스트링 버그(FSB) 포맷 스트링 버그는 주로 C언어의 printf 함수를 사용할 때 발생한다. %d, %s 와 같은 것들을 포맷 스트링이라고 하는데, buf를 입력받고 해당 buf를 출력할 때 포맷 스트링을 이용해 흐름을 바꿀 수 있다. 보통 문자열을 출력하기 위해 C언어에서는 다음과 같이 코드를 작성한다. #include int main(){ char buf[]; scanf("%s", buf); printf("%s", buf); return 0; } printf 함수를 위의 형태가 아닌 아래의 형태로 사용해도 그대로 출력되기는 한다. printf(buf); 하지만 이 때, buf에 %s 와 같이 포맷 스트링을 입력하게 되면, printf("%s")가 되는데, %s에 들어갈 값을 지정해주지 않았기.. [ProjectH4C] HackCTF (bof_basic 1~2) bof_basic #1 HackCTF에서 제공하는 Pwnable 카테고리의 첫 번째 문제이다. HackCTF에서는 각 문제마다 포트를 제공하는데, 해당 서버와 포트에 값을 보낸 후에 쉘을 획득하여 flag를 획득한 후 사이트에 제출하는 방식이다. 추가로 디버깅을 위해 실행 파일도 별도로 제공한다. 제일 먼저 ctf.j0n9hyun.xyz 3000 서버에 값을 입력해보았다. 입력을 buf에 저장한 후에, 특정한 위치의 값을 확인하는 듯 한다. buf의 크기가 얼마인지, 어느 부분의 값을 덮어씌워야 하는지 gdb와 IDA를 통해 알아보았다. (gdb) disas main Dump of assembler code for function main: 0x080484cb :lea ecx,[esp+0x4] 0x080.. [ProjectH4C] OverTheWire Bandit 26 ~ 32 write-up Bandit26 Good job getting a shell! Now hurry and grab the password for bandit27!쉘을 얻는 것에 대해 칭찬하면서 서둘러 bandit27의 패스워드를 잡으라고 한다. ls -al 를 이용해 어떤 파일이 있는지 확인해보았다. bandit27의 setUID가 설정된 bandit27-do 파일이 보인다. 해당 파일을 실행해보았다. bandit20-do 와 같은 에러메세지가 출력된다. 사용법이 똑같은가 싶어 다음을 실행해보았다. $ ./bandit27-do cat /etc/bandit_pass/bandit27 bandit27의 패스워드가 출력되었다. Bandit27There is a git repository at ssh://bandit27-git@l.. [ProjectH4C] OverTheWire Bandit 0 ~ 25 write-up OverTheWire에서 제공하는 워게임 중 Bandit는 리눅스의 기능을 익힐 수 있도록 만들어진 워게임이다. 시스템 해킹을 위해선 리눅스를 능숙하게 다룰 줄 알아야 하기 때문에, 해당 워게임을 통해 리눅스에 대해 공부해보고자 한다. OverTheWire 워게임은 ssh를 이용해 접속해야 한다. MacOS 기준으로 작성하자면, ssh 접속을 위한 명령어는 아래와 같다. ssh [사용자 이름]@[서버 이름] -p [포트 번호] OverTheWire에서 Bandit 탭을 클릭하면 왼쪽 상단에 서버 이름과 포트 번호가 나온다. 서버 이름은 bandit.labs.overthewire.org 이고 포트 번호는 2220이다. 참고로 시작 단계인 bandit0의 비밀번호는 bandit0이다. Bandit 0 먼저,.. [ProjectH4C] 해커스쿨 LOB(BOF 원정대) Level12 golem에 로그인 하면 darkknight 실행파일과 darkknight.c 소스 파일이 존재한다. 소스부터 확인하였다. /* The Lord of the BOF : The Fellowship of the BOF - darkknight - FPO */ #include #include void problem_child(char *src) { char buffer[40]; strncpy(buffer, src, 41); printf("%s\n", buffer); } main(int argc, char *argv[]) { if(argc [ProjectH4C] 해커스쿨 LOB(BOF 원정대) Level11 steleton에 로그인하면 golem 실행 파일과 golem.c 소스 파일이 보인다. 소스 파일의 내용은 다음과 같다. /* The Lord of the BOF : The Fellowship of the BOF - golem - stack destroyer */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } strcpy(buffer, argv[1]); .. 이전 1 2 3 4 5 ··· 8 다음