pwnable23 arm register ctf에서 arm 문제가 나와서 써보았다. 문제 풀면서 더 추가 예정! R0 ~ R12 : 범용 레지스터 (다목적 레지스터), R11(스택 프레임 포인터) - ebp 역할인데 리턴 주소로 안씀 R0 : 함수 리턴 값 저장 (EAX 같은 느낌) R0 ~ R3 : 함수 호출 인자 전달 R13 ~ R15 : 특수 레지스터 R13(SP) : 스택 포인터 : 스택의 맨 위를 가리킴 (ESP 같은 느낌!) R14(LR) : 링크 레지스터 : 서브루틴 후에 돌아갈 리턴 주소 저장 (EBP 느낌) R15(PC) : 프로그램 카운터 : 현재 fetch되고 있는 명령어의 주소 - 따라서 현재 실행되는 명령어의 다음다음 주소 (EIP 느낌) CPSR : 현재 프로그램 상태 레지스터 arm rop 참고자료 https://jo.. 2021. 5. 15. 2021 UTCTF writeup 전에 주말에 하길래 참여해봤다. 펀문제 위주로 풀었다 2021. 5. 7. house of botcake how2heap에 있는 코드를 보자 static uint64_t victim = 0; int main() { setbuf(stdin, NULL); setbuf(stdout, NULL); char *x[7]; for(int i=0; i 이제 임의의 주소로 할당 가능 malloc(0x100); // b 할당됨 char *target = malloc(0x100); //적어준 임의의 주소 할당!!! printf("Before attack, victim's value: 0x%lx\n", victim); *(uint64_t*)target = 0xdeadbeef; printf("After attack, victim's value: 0x%lx\n", victim); return 0; } 디버깅을 해보자! 힙주소 7개를.. 2021. 2. 10. pwnable.xyz - free spirit 먼저 64bit 바이너리이다. 보호기법을 보니 full relro여서 got overwrite는 안될것 같다. 코드를 보다보니 해당 바이너리는 포인터 내부의 값을 해당 포인터 -0x8 부분으로 mov해주는 코드가 있다. 따라서 포인터를 덮을 수 있고 입력해주는 부분에서 그 포인터 내부의 값을 쓸 수 있으므로 원하는 주소에 원하는 값을 쓸 수 있다. 또한 stack leak을 그냥 해줘서 ret 주소를 그냥 알아낼 수 있다. cat flag를하는 함수도 제공해줘서 ret에 그냥 cat flag 함수 주소를 넣고 정상 종료 시키면 플래그가 나올거라 생각했다. 하지만 정상 종료 전에는 덮어준 포인터 부분을 free해주는 부분이 있어 해당 오류가 계속 발생했다. 따라서 fake chunk를 생성해서 free를 .. 2021. 1. 11. [write-up]2018 secoon ctf - profile c++로 되어 있는 바이너리라 분석하기 좀 힘들었다. 그냥 원하는거 릭이 되고 공격벡터도 워낙 명확해서 바로 풀 수 있을 줄 알았는데 생각보다 오래걸렸다... 그 이유는 자꾸 bof가 나는 중간에 포인터를 free해주는데 그 포인터 값을 덮게 되어서 double free가 자꾸 났다 ㅎㅎ 그래서 environ이라는 libc에서 스택 가리키는 것이 있어서 environ 릭하고 얻은 스택으로 다시 canary 릭해서 rop로 풀었다. libc중 stack을 가리키는 것 environ 꼭 기억하자!!! 너무 졸린 상태에서 풀어서 익스 코드는 내가봐도 너무 더럽다.... payload # usr/bin/env python # ryuuu from pwn import * libc = ELF("./libc-2.23".. 2018. 11. 6. how2heap - fastbin_dup into stack 저번에 fastbin_dup를 봤는데 이제 fastbin_dup에서 조금 업그레이드 된 fastbin dup into stack을 번역하면서 따라가 보도록 하자. 먼저 코드를 보자 int main() { fprintf(stderr, "This file extends on fastbin_dup.c by tricking malloc into\n" "returning a pointer to a controlled location (in this case, the stack).\n"); unsigned long long stack_var; fprintf(stderr, "The address we want malloc() to return is %p.\n", 8+(char *)&stack_var); fprintf.. 2018. 9. 13. 이전 1 2 3 4 다음