I am trying to run ltrace
on this file:
./launcher: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=f6f8cf3307e0ee26723f4d03ec68f022d15e56b6, stripped
When I pop it open in ghidra, and view the decompiled c, I can see that it changes the program flow to somewhere I don't want to be when ltrace is running.
attached_to_ptrace = ptrace(PTRACE_TRACEME,0,1,0);
if (attached_to_ptrace == -1) {
puts("I am not your property!");
exit_code = 1;
}
else {
// execute main loop
}
Looking at the man page for ptrace
, I see:
long ptrace(enum __ptrace_request request, pid_t pid,
void *addr, void *data);
Meaning that if the program? or ltrace? were to run with a different PID, I would be able to successfully run my program using ltrace.
This is the current output I get when running the program with ltrace
:
~/ctf/cyberstart/level13/04 [master|…1] $ ltrace ./launcher
__libc_start_main(0x565a86f0, 1, 0xff837be4, 0x565a8970 <unfinished ...>
ptrace(0, 0, 1, 0) = 0xffffffff
puts("I am not your property!"I am not your property!
) = 24
+++ exited (status 1) +++
Without ltrace:
~/ctf/cyberstart/level13/04 [master|…1] $ ./launcher
Enter the password:
password
Away now, you anklebiter!
[1]+ Stopped ./launcher
(This is my second buffer overflow CTF challenge, where the main goal is to mess with this block of code:)
int iVar1;
char local_1e [10];
int local_14;
int local_10;
local_10 = 0;
puts("\nEnter the password: ");
gets(local_1e);
iVar1 = strcmp(local_1e,"PAssw0rd");
if (iVar1 == 0) {
puts("Well done! Unfortunately, you have to try harder.");
local_10 = 0;
}
else {
puts("Away now, you anklebiter!");
}
if (local_10 != 0) {
printf("Unexpected error condition. Control char is %d\n",local_10);
local_14 = param_2 * local_10;
(*(code *)(local_14 + param_1))();
}
How can I run ltrace in a way such that it isn't detected?