System/PWNABLE
[HackCTF] look at me
checksec 32bit statically linked not stripped Pseudo Code gets함수 이용하기 ==> overflow 취약 v1은 ebp - 18h ==> 0x18 + SFP(4) 를 dummy로 채우면 return address를 덮어 쓸 수 있을 것 실행 Payload 함수 주소 구하기 gets 주소 = 0x804f120 mprotect 주소 = 0x806e0f0 writable Area .bss = 0x80eaf80 >> 0x80eab000 에 "/bin/sh\x00" 쓰기 gadget int 0x80 ; ret ; = 0x806f630 pop eax ; ret ; = 0x80b81c6 pop ebx ; ret ; = 0x80481c9 pop ecx ; ret ; = ..
gets_
checksec 32bit NX 걸려있음 Pseudo Code 포함되어 있는 함수가 엄청 많다 vuln()함수에서 ebp-18의 v1 변수에 gets 함수를 통해 사용자로 부터 입력받는다. >> 18 0x18+ 4(SFP) byte 이상 입력하면 return address 덮어 쓸 수 있을 것 실행 Payload esp: 0xffffcfcc arg[1]의 시작주소: 0xffffcfa4 28개 이상의 문자를 입력함으로써 리턴어드레스를 덮을 수 있다 gets 함수 plt 주소 gets = 0x804f290 >> statically linked library이기 때문에 plt와 got가 구별되지 않는다. writable area 찾기 /bin/sh이 현재 파일 내에 쓰여있지 않기 때문에 따로 써줘야한다 .da..
[ROP Emporium] write4
checksec 64bit NX bit 걸려있음 Pseudo Code disassembler code를 확인해보면 (한 번 실행을 하고 disassemble 해야 이런 코드가 뜬다) 0x20 byte만큼 buf에서 200byte만큼 read함수를 통해 읽는다. (+) file을 인자로 전달해 exit함수를 우회해야한다. >> "flag.txt" 사용 (+) buf의 크기 buffer에 할당된 buf의 크기(RSP): 0x38 byte >> OVERFLOW 발생 실행 Payload 작성 libc leak print_file 함수를 이용해 libc_base를 구하기 여러 가지 offset 구하기 system - libc = 0x453a0 puts - system = 0x2a300 puts - libc = 0..
[HackCTF] pwning
checksec 32bit NX 걸려있음 Pseudo Code vuln()함수로 바로 연결 get_n 함수를 호출해 숫자를 입력받는 과정을 수행 nptr: 2C byte 만큼 buffer에 할당되어 있음 7: get_n(&nptr, 4); 8: v2 = nptr을 atoi함수로 int형으로 전환한 값 9: v2의 값이 32보다 클 경우 경고 메시지 출력+종료 12: v2의 값이 32보다 작을 경우 get_n함수를 한 번 더 호출 이때 v2를 get_n의 두번째 인자로 전달 while 문v4: buffer에 D(=13)byte 할당되어있음 --> getchar()함수로 값 입력받기 0 또는 10(0xA)을 입력하면 while문 break v5가 0부터 시작해 v5++를 반복하면서 두번째 인자로 전달되는 a..
BaskinRobins31
checksec NX 걸려있는 64bit 파일 IDA로 pseudo code 확인 read함수를 통해 s에 저장된 값을 0x190 byte만큼 n에 저장 n은 0x10만큼 처음 할당받았기 때문에 OVERFLOW 취약성 발생 실행 찾기 문자열 "/bin/sh" 찾기 "/bin/sh" 문자열 주소 = 0x7ffff7b99e17 libc 주소 = 0x7ffff7a0d000 system - libc offset = 0x453a0 write - libc offset = 0xf7370 gadget 찾기 one gadget rp++ payload 작성 정리 binsh - libc offset = 0x18ce17 system - libc offset = 0x453a0 write - libc offset = 0xf737..
r0pbaby
checksec NX, PIE 걸려있음 (PIE: 프로그램 실행할 때마다 전역변수와 사용자 정의 함수의 주소가 매번 달라진다) → offset으로 접근 64 bit Pseudo Code 굉장히 긴 main함수의 pseudo code.... savedregs에서 [rbp+0]로 SFP임을 알 수 있다 debugging pwndbg로 실행시켰을 때 RDI, RSI, RDX,RCX, R8, R9 순으로 파라미터 전달. offset 구하기 system - libc offset = 0x453a0 binsh - libc offset = 0x18ce17 onegadget gadget- libc offset = 0x45226 payload 작성 2번 메뉴를 통해 system 주소를 얻고, libc.symbols['sy..
babyROP
checksec 64bit binary NXbit 걸려있음 ASLR IDA로 pseudo code 확인 buf의 크기는 40인데 read함수를 통해 0x300만큼 입력받게 함 >> OVERFLOW 취약성 발생! buf에 입력을 하고(What is your name?) Hello, 뒤에 buf에 입력한 내용이 출력된다. Debugging rsp에 저장된 값(0x7fffffffde18)이 가리키는 값 : 0x7ffff7a2d830(=return address) rsi에 저장된 값: 0x7fffffffddd0 (=buf의 시작주소) buf에 72byte 채워주면 return address를 덮어 쓸 수 있을 것 libc에서 "/bin/sh"문자열 찾기 libc = 0x7ffff7a0d000 "/bin/sh" ..
simpleROP
checksec IDA로 pseudo code 확인 buf의 크기: 0x100 = 256 byte read함수를 통해 0x300 = 768byte만큼 입력받음 >> overflow 발생 Debugging Overflow check esp(0xffffd00c)에 저장된 값: 0xf731c637 esp(0xffffcefc)에 저장된 값: 0x0, 0xffffcf08, 0x300 buf의 시작주소(0xffffd00c) - return address(0xffffcf08) = 260 byte => 260개 이상의 문자를 입력해 return address 덮어쓸 수 있음 쓰기 가능한 메모리 영역 찾기 쓰기 가능한 메모리 영역: 0x0804a000~0x0804b000 .got.plt 주소: 0x0804a000, si..
shot
checksec IDA로 pseudo code 확인 IDA x64로 실행 2번 메뉴 선택: 원하는 주소값을 출력 3번 메뉴 선택: while 반복문 종료 1번 메뉴 선택: buf에 0x38byte만큼 입력 입력받은 값을 buf에 저장 buf-v7 = 20-10 debugging $2: "/bin/sh" 주소 - system() 주소 $3: "/bin/sh"주소 - libc 주소 one_gadget offset Exploit from pwn import * context.log_level = "debug" p=process("./shot") elf=ELF("./shot") libc=elf.libc p.sendlineafter("> ", '2') p.recvuntil("stdin: ") stdinaddr=i..
simpleRTL
checksec IDA로 pseudo code 확인 system의 주소를 출력받고 문자열 s를 입력하게 되어있음 ./simpleRTL 실행하면 system()함수의 주소를 출력하고 문자열 s에 사용자로부터 입력을 받도록 한다. debugging libc-2.23.so 시작 주소: 0xf7dff000 라이브러리 내에 있는 문자열 /bin/sh의 주소: 0xf7f5aa0b system()함수와 '/bin/sh' 주소 사이에 "A"*4를 넣었을 때 계속 오류 발생 >> exit()함수의 주소를 넣어줌 $3: exit() - libc $4: system() - libc $5: /bin/sh - libc Exlploit from pwn import * context.log_level = "debug" p=proc..