libc database. local에서 사용해보자.
·
Tips & theory
서론 사실 매번 libc-database libc-database libc.rip 에서 검색해서 사용했는데, local에서 사용할 수 있는 방법이 있다. 예전부터 알고 있었는데 사실 그냥 귀찮아서 자세히 찾아보지 않았었고, 그닥 필요 없을거라 생각해서 안썼는데, CTF를 뛰다 ld 파일을 구하기가 힘들어서 사용하게 되었다. 설치 github를 통해 다운로드 가능하다. GitHub - niklasb/libc-database: Build a database of libc offsets to simplify exploitation GitHub - niklasb/libc-database: Build a database of libc offsets to simplify exploitation Build a dat..
rtld
·
Wargame/Dreamhack
1. intro 2. code 및 분석 2.1 code // gcc -o rtld rtld.c -fPIC -pie #include #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } void get_shell() { system("/bin/sh"); } int main() { long addr; long value; initialize(); printf("stdout..
patchelf 사용법.
·
Tips & theory
딱 두개 명령어만 기억하자 ┌──(kali㉿kali)-[~/Downloads] └─$ patchelf --set-interpreter ./ld-50390b2ae8aaa73c47745040f54e602f.so.2 tcache_dup ┌──(kali㉿kali)-[~/Downloads] └─$ ldd tcache_dup linux-vdso.so.1 (0x00007ffcde7ea000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f60a2022000) ./ld-50390b2ae8aaa73c47745040f54e602f.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f60a2211000) ┌──(kali㉿kali)-[~/Downl..
함수의 offset은 왜 strings로 찾아지지 않는가?
·
Tips & theory
공부 초기에 offset을 찾는 방법이 너무 헷갈렸다. 왜 /bin/sh 문자열의 offset은 strings -tx filename | grep /bin/sh 로 찾아지고 system 함수는 strings -tx filename | grep system 으로 찾아지긴 하지만 실제 offset과 왜 다른가? 요약하자면 그 이유는 "함수명"은 함수 초기에 무조건 나오는 것이 아니기 때문이다. strings 명령어는 말 그대로 파일 내에 string을 찾아 출력해준다. 그 말인 즉슨, 파일 내에는 hex 값으로된 수 많은 데이터들이 있다. 이 값들 중 string으로 저장된 값들만 출력해주는 역할을 한다. 예를 들어보자. /bin/sh는 파일 내에 문자열로 들어있을 것 같지만 실제로는 ascii code에 ..
heap tcache & main_arena
·
Tips & theory
tcache(thread local cache) heap 관리를 빠르게 하기 위해 glibc 2.26 이상부터 적용되는 기술. fast bin과 유사하지만 다른 성격을 가짐. tcache는 heap 영역에 존재함. 32 bit 에서는 516 byte 이하의 사이즈, 64 bit 에서는 1032 byte 이하의 사이즈가 할당되었을때 tcache를 사용함. 예제로 256 byte로 4개를 할당하고 첫번째 영역을 free 해서 fd, bk 값을 보면 다시 heap 영역을 가르키고 있으며, gef➤ x/40gx 0x555555603000 0x555555603000: 0x0000000000000000 0x0000000000000291 0x555555603010: 0x0000000000000000 0x0000000..
libc에서 offset 찾기.
·
Tips & theory
pwnable 문제를 풀다보면 libc 파일을 제공해주는 경우가 다수 있다. 하지만 offset을 구할때 자꾸 헷갈리는 부분이 있어 다시 정리한다. pwntools로 찾기 해당 파일의 libc 버전 또는 경로를 확인해서 ┌──(kali㉿kali)-[~/Downloads/1279bf21-e0f3-46a4-b577-3c3955c458fb] └─$ ldd oneshot linux-vdso.so.1 (0x00007ffc07293000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f361f1f0000) /lib64/ld-linux-x86-64.so.2 (0x00007f361f5e1000) 간단한 파이썬 코딩으로 libc 파일의 offset 확인. from pwn..
oneshot
·
Wargame/Dreamhack
// gcc -o oneshot1 oneshot1.c -fno-stack-protector -fPIC -pie #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } int main(int argc, char *argv[]) { char msg[16]; size_t check = 0; initialize(); printf("stdout: %p\n", stdout); pr..
문제에서 제공된 libc 파일 사용.
·
Tips & theory
offset을 찾는 것은 아래 링크 참조. https://wyv3rn.tistory.com/64 libc에서 offset 찾기. pwnable 문제를 풀다보면 libc 파일을 제공해주는 경우가 다수 있다. 하지만 offset을 구할때 자꾸 헷갈리는 부분이 있어 다시 정리한다. pwntools로 찾기 해당 파일의 libc 버전 또는 경로를 확인해서 ┌ wyv3rn.tistory.com 문제에서 libc 파일을 제공할 때, 프로그램 실행 시 해당 libc 파일을 로드해주지 않으면 본인 컴퓨터의 libc를 사용하기 때문에 공격 대상 환경과 달라 offset이 차이가 난다. 예를 들면 아래와 같이 libc-2.27.so 파일이 제공되었지만 실제로는 다른 파일을 사용하는 것을 볼 수 있다. ┌──(kali㉿kal..
fho
·
Wargame/Dreamhack
// Name: fho.c // Compile: gcc -o fho fho.c #include #include #include int main() { char buf[0x30]; unsigned long long *addr; unsigned long long value; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); puts("[1] Stack buffer overflow"); printf("Buf: "); read(0, buf, 0x100); printf("Buf: %s\n", buf); puts("[2] Arbitary-Address-Write"); printf("To write: "); scanf("%llu", &addr); printf..
rop
·
Wargame/Dreamhack
// Name: rop.c // Compile: gcc -o rop rop.c -fno-PIE -no-pie #include #include int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); // Leak canary puts("[1] Leak Canary"); printf("Buf: "); read(0, buf, 0x100); printf("Buf: %s\n", buf); // Do ROP puts("[2] Input ROP payload"); printf("Buf: "); read(0, buf, 0x100); return 0; } 앞선 문제와 동일하게 canary는 얻으면 되고, 이 문제의 ..